我在基于另一个字典的值压缩一个字典中的计数值时遇到问题。
我在下面编写了这样的代码,表示以下内容:
1)提取要列出的数据
2)为下一个处理取唯一值
3)仅用于计算“意外”的男性和女性人数的循环
对uniqe集合中每个类别的值进行计数的有效解决方案是什么?我的意思是,如果我有1000个uniqe类别,我不想写1000个“ if's”
这是我在stackoverflow中的第一个问题,这就是为什么我为我犯的任何错误感到抱歉:)
Original data (first 5 rows):
[
['', 'year', 'month', 'intent', 'police', 'sex', 'age', 'race', 'hispanic', 'place', 'education'],
['1', '2012', '01', 'Suicide', '0', 'M', '34', 'Asian/Pacific Islander', '100', 'Home', '4'],
['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'],
['3', '2012', '01', 'Suicide', '0', 'M', '60', 'White', '100', 'Other specified', '4'],
['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4']
]
# Accidents list
accidents_list = [row[3] for row in data] # list of all accidents
print(set(accidents_list)) # unique set
{'杀人','不适用','不确定','意外','自杀'}
gender_list = [row[5] for row in data]
print(gender_list)
['M','F','M','M','M','M','M','M','M','M','M','M ','M','M','M','M','M','M','M','M','M','F','F','M', 'M'....]
# Accidents dict and loop over it
accidents_gender = {}
for i, v in enumerate(gender_list):
if v not in accidents_gender:
accidents_gender[v] = 0
if accidents_list[i] == 'Accidental':
accidents_gender[v] += 1
print(accidents_gender) # printing only values for accidental
{'M':1421,'F':218}
答案 0 :(得分:0)
您可以使用Counter
(已记录here)。
我会使用Pandas(例如下面的示例),但是如果这太过分了,这是使用Counter
来解决的方法:
from collections import Counter
# Exclude header
data = data[1:]
# Filter accidents
accidents = filter(lambda x: x[3] == 'Accidental', data)
# Count by gender
by_gender = Counter(item[5] for item in accidents)
print(by_gender)
这是使用Pandas的一种方法:
import pandas as pd
df = pd.DataFrame.from_records(data=data[1:], columns=data[0])
# Filter 'Accidental', group by sex, get the size of each group
df = df[df['intent'] == 'Accidental'].groupby('sex').size()
# Print it out
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(df)
为此,最好使用Jupyter Notebook。熊猫文档非常棒,但也有很多需要摘要的内容。 This SO answer有很好的相关信息。
我希望这会有所帮助。