【问题标题】:Frequency Dictionary from Pandas Data Frame来自 Pandas 数据框的频率字典
【发布时间】:2014-09-28 13:23:24
【问题描述】:

我正在尝试从 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}

【问题讨论】:

  • 你能显示输入和预期输出吗?我觉得您正在寻找 pd.value_counts(Series),但很难完全按照您的要求进行操作
  • value_counts() 有什么问题?
  • 刚刚添加了示例输入/输出.... value_counts() 可以处理多列吗?
  • value_counts 在一个系列上运行,你不能在 df 上调用它,看我的回答

标签: python dictionary pandas dataframe frequency


【解决方案1】:

您可以对每一列使用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

如果您想访问“Dog”计数,那么temp['Animal']['Dog'] 将输出 2

【讨论】:

  • 正是我想要的,而且比我的嵌套 for 循环要快得多。谢谢!
猜你喜欢
  • 2018-05-04
  • 2016-02-10
  • 2018-11-17
  • 1970-01-01
  • 2015-05-30
  • 2021-09-03
  • 2019-02-23
  • 2018-12-11
  • 2016-04-15
相关资源
最近更新 更多