我有一个带有此设置的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:我想以矢量化的方式做到这一点。
答案 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