从Pandas数据框创建频率字典

3 投票
1 回答
3436 浏览
提问于 2025-04-18 16:07

我想从一个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。

撰写回答