来自Pandas Dataframe的频率字典

时间:2014-08-05 18:58:17

标签: python dictionary pandas dataframe frequency

我正在尝试使用列名作为键从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 个答案:

答案 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