我正在尝试使用列名作为键从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}
答案 0 :(得分:1)
您可以对每列使用value_counts
并为其指定一个dict以生成系列的词典:
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