在pandas数据帧中计算值频率

时间:2015-09-29 10:24:49

标签: python pandas

我有一个带有此设置的pandas数据帧df

col1 col2
v1   i1
v1   i50
v2   i60
v2   i1
v2   i8 
v10  i8
v10  i1 
v10  i2 
..

我想计算col1的多少元素的col2值。并使用此设置将结果存储到数据框中

col1 frequency
i1   80
i2   195
...  ...

我试图在熊猫中做到这一点,

 item_frequency = pd.unique(relevant_data[relevant_data['col2'].isin(pd.unique(relevant_data['col2'].values.ravel()))]['col1'].values.ravel())

产生错误

raise ValueError('Lengths must match to compare')
ValueError: Lengths must match to compare
PS:我想以矢量化的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

目前还不太清楚你想得到什么结果,所以如果你想要col1, col2, frequency - 那么你可以使用groupby()size()

In [5]: df.groupby(['col1', 'col2']).size()
Out[5]: 
col1  col2
v1    i1      1
      i50     1
v10   i1      1
      i2      1
      i8      1
v2    i1      1
      i60     1
      i8      1

如果您只想计算col2的计数,那么value_counts()将起作用:

In [6]: df['col2'].value_counts()
Out[6]: 
i1     3
i8     2
i60    1
i2     1
i50    1
dtype: int64

<强>更新

在您更新了说明后,我发现value_counts()可能会给您错误的答案,如果每次交易可能会有一次超过一次。但您可以使用drop_duplicates()

解决此问题
In [9]: df.drop_duplicates()['col2'].value_counts()
Out[9]: 
i1     3
i8     2
i60    1
i2     1
i50    1
dtype: int64