当被熊猫中的另一列分组时如何返回value_counts()

问题描述 投票:1回答:2

我想在基于col1的熊猫分组后,将col2的value_counts中的值返回到原始数据帧。

即我有...

   col1 col2
0  1111    A
1  1111    B
2  1111    B
3  1111    B
4  1111    C
5  2222    A
6  2222    B
7  2222    C
8  2222    C

我想...

   col1 col2  col3
0  1111    A     1
1  1111    B     3
2  1111    B     3
3  1111    B     3
4  1111    C     1
5  2222    A     1
6  2222    B     1
7  2222    C     2
8  2222    C     2

我可以使用groupby来获取col3的值,然后将col2的值传递给value_counts,但是我不确定如何将其返回到数据帧中。

示例:

d1 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
      'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C']}
df1 = pd.DataFrame(data=d1)
d2 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
      'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C'],
      'col3': [1, 3, 3, 3, 1, 1, 1, 2, 2]}
df2 = pd.DataFrame(data=d2)
print(df1)
print(df2)
counts = df1.groupby('col1').apply(lambda x: x.col2.value_counts()[x.col2])
print(counts)
python pandas
2个回答
1
投票

您可以通过groupbytransform进行设置。

df['col3'] = df1.groupby(['col1','col2'])['col2'].transform('count')
print(df)
    col1    col2    col3
0   1111    A   1
1   1111    B   3
2   1111    B   3
3   1111    B   3
4   1111    C   1
5   2222    A   1
6   2222    B   1
7   2222    C   2
8   2222    C   2

0
投票

我不确定这是否是最佳选择,但这是我的努力。用.transform('count')读取@Terry的评论让我觉得自己喜欢用手指数数:

import pandas as pd
d1 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
      'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C']}
df1 = pd.DataFrame(data=d1)

df_aux = df1.groupby(['col1','col2'])['col1'].count().rename(columns={0:'col3'})
df_aux = df_aux.reset_index()
df_output = df1.merge(df_aux.rename(columns={df_aux.columns[2]:'col3'}),how='left',on=['col1','col2'])
print(df_output)

输出:

   col1 col2  col3
0  1111    A     1
1  1111    B     3
2  1111    B     3
3  1111    B     3
4  1111    C     1
5  2222    A     1
6  2222    B     1
7  2222    C     2
8  2222    C     2
© www.soinside.com 2019 - 2024. All rights reserved.