【问题标题】:How to return value_counts() when grouped by another column in pandas如何在熊猫中按另一列分组时返回value_counts()
【发布时间】:2020-01-20 19:10:45
【问题描述】:

我想在基于 col1 的 pandas groupby 之后将 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


    【解决方案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
    

    【讨论】:

    • Transform 是一个很棒的工具,可惜我总是怀念它。
    • 这太完美了。我实际上尝试过变换,但我做了 df1.groupby(['col1'])['col2'] 而不是 df1.groupby(['col1', 'col2'])['col2']!
    【解决方案2】:

    我不确定这是否是最佳选择,但这是我的尝试。使用.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
    

    【讨论】:

      【解决方案3】:

      您好,以下是另一种方法:

      只需在笔记本中执行:

      import pandas as pd
      
      dictionary1={ 'col1':[1111,1111,1111,1111,1111,2222,2222,2222,2222],
                    'col2':['A','B','B','B','C','A','B','C','C']
                  }
      df1=pd.DataFrame(dictionary1)
      
      d=df1.groupby(['col1','col2'])['col2'].count().rename(columns={'col3'})
      
      pd.DataFrame(d,columns=['col3'])
      

      输出

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 2022-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2016-07-07
        • 1970-01-01
        • 2016-05-23
        相关资源
        最近更新 更多