【问题标题】:How can I count occurrences of a string in a csv file row if another row has a certain value?如果另一行具有特定值,如何计算 csv 文件行中字符串的出现次数?
【发布时间】:2019-11-05 14:05:03
【问题描述】:

我有一个 csv 文件,其中包含一排国家/地区值和一排奥运奖牌。我想数一下哪个国家获得了多少奖牌。

我用 pandas 尝试过,但它给了我一个错误消息,它找不到“国家”行,尽管该行确实存在并且它被命名为国家 CSV 文件:

from collections import Counter
import pandas as pd
import csv

with open('olympics.csv', 'r', encoding='utf-8', newline='') as csv_file:

    df = pd.read_csv("olympics.csv",
                     index_col=["NOC","Medal"])
                     #usecols=["NOC","Medal"])
    #df.sort_index()

    #grouped = df.groupby(['NOC', 'Medal'])

    grouped = df.groupby(['NOC','Medal'])['NOC'].count()

print(grouped)

输出应该是这样的:

USA 2366 
UK  2189 
Denmark 1455 
....

【问题讨论】:

  • 我也可以不使用 pandas 来解决问题,我已经用 dict reader 试过了,但也没用过
  • “国家”还是“NOC”?
  • 所以你的 csv 看起来像这样 -> (row 1 -> usa, uk, denmark) | (第 2 行 -> 2366、2189、1455)?
  • 对不起,它被命名为 NOC,我只是为了理解写了国家
  • 一排是国家的名字,叫做NOC,一排是奖牌的名字,叫做奖牌,里面只有金银铜牌,

标签: python pandas csv sorting dataframe


【解决方案1】:

可以使用“csv”库中的 DictReader 解决。

import csv
import collections

csv_file = open('olympics.csv', 'r', encoding='utf-8')
csv_input = csv.DictReader(csv_file)
country_medals_map = collections.defaultdict(int)
# initializes the country_medals_map with default value as int which will be 0.
# e.g test_dict = defaultdict(int), print(test_dict['not_set_key']) => 0

for input in csv_input:
    country_medals_map[input['NOC']] += 1 if input['Medal'] in ['Gold', 'Silver', 'Bronze'] else 0
    # set dict key as the rows country('NOC') value and increasing the dict value if medal present in GOLD SILVER or BRONZE.

 # finally printing our dict formed.
 for key, value in country_medals_map.items():
     print(key, '-', value)

 # output
 # GRE - 10
 # AUS - 5
 # Uk - 20

如果您希望对输出进行排序,而不是在创建时对其进行排序(更新),而是在之后对其进行排序。

sorted_by_medals = sorted(country_medals_map.items(), key=lambda kv: kv[1], reverse=True)

# printing our sorted output
for item in sorted_by_medals:
     print(item)

# output
# ('Uk', 20)
# ('GRE', 10)
# ('AUS', 5)

【讨论】:

  • 非常感谢您的帮助,我尝试了代码,但不幸的是我收到一条错误消息:UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3782: character maps to
  • 哦,这是因为文件打开方式会更新它需要的答案 "open(filename, 'r', encoding='utf-8')" 这样,这样就可以解决问题了
  • 现在可以了,因为文件中有一些德语字符,所以缺少编码。谢谢!!!!你帮了我很多!!!
【解决方案2】:

最后我自己找到了不使用 pandas 的答案。

import csv

d = {}

with open('olympics.csv', 'r', encoding='utf-8', newline='') as f:

    dialect = csv.Sniffer().sniff(f.read(1024))
    #print(dialect)

    # Move to beginning of file
    f.seek(0)

    # DictReader uses the first row in the file as headers.
    r = csv.DictReader(f, dialect=dialect)

    for row in r:

        if row['Medal'] == 'Gold'or 'Silver'or 'Bronze':
            d[row['NOC']] = d.get(row['NOC'], 0) + 1
            #d.sort(key=itemgetter(1)
for k in d:
    #k.sort(key=lambda element: element[1]

    print('{}  {}'.format(k, d[k]))```````

【讨论】:

  • 我只是想知道如何对其进行排序,因为我尝试过的东西,被注释掉的两个都不起作用
  • 我在上一部分的答案中已经解释了排序,您可以参考。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多