从Pandas数据框创建频率字典
我想从一个Pandas数据框中获取键值对的频率统计,使用列名作为键。
虽然有很多相关的问题,但没有一个能真正帮我实现我的目标,所以我写了一个嵌套的for循环来完成这个任务:
#first get all key value pairs
d = {}
for var in list(df.columns.values):
d[var] = df[var].unique().tolist()
#then count
d_num = {}
for k,l in d.iteritems():
for v in l:
d_num[(k+'_'+str(v))] = len(df[df[k]==v])
freqs = Counter(d_num.values()).most_common()
显然,这样做速度很慢,但我想不出其他使用向量化方法的办法。有没有什么好主意?
编辑: 这里有一个示例输入:
Name Animal Legs Color
0 Foo Dog 4 Brown
1 Bar Cat 4 White
2 Baz Cat 4 Black
3 Foo Bird 2 Black
4 Foo Dog 4 White
输出(不一定是字典,也不一定是那种键):
out = {Name_Foo: 3, Name_Bar:1, Name_Baz:1, Animal_Dog:2, Animal_Cat:2, Animal_Bird:1, Legs_2:1, Legs_4:4, Color_Brown:1, Color_White:2, Color_Black:2}
1 个回答
4
你可以使用 value_counts
这个功能来统计每一列的数据,并把结果放到一个字典里,这样就能得到一个包含多个序列的字典。
In [19]:
temp={}
for col in df:
temp[col] = df[col].value_counts()
temp
Out[19]:
{'Animal': Dog 2
Cat 2
Bird 1
dtype: int64, 'Name': Foo 3
Baz 1
Bar 1
dtype: int64, 'Legs': 4 4
2 1
dtype: int64, 'Color': Black 2
White 2
Brown 1
dtype: int64}
In [21]:
temp['Animal']
Out[21]:
Dog 2
Cat 2
Bird 1
dtype: int64
如果你想查看“狗”的数量,可以用 temp['Animal']['Dog']
这个方式来获取,结果会显示2。