【问题标题】:Creating a custom column after groupby in csv, pandas在csv,pandas中的groupby之后创建自定义列
【发布时间】:2020-11-28 20:16:27
【问题描述】:

鉴于以下 csv 文件:

ID  A   B   C   R1  R2
-----------------------
1   A1  B1  C1  abc ghi
1   A1  B1  C2  def jkl
2   A2  B3  C1  mno stu
2   A2  B3  C2  pqr vwx

需要在下面的输出中添加一个新列“R”:

ID  A   B  R
-------------------------
1   A1  B1 (abc, def) & (ghi, jkl)
2   A2  B3 (mno, pqr) & (stu, vwx)

假设 C 列只有 C1、C2 值

import pandas as pd
df = pd.read_csv(r'file.csv')
grouped_df = df.groupby(['ID', 'A', 'B'])

# Here how do we create our new and custom column?

【问题讨论】:

    标签: python excel pandas csv pandas-groupby


    【解决方案1】:
    In [54]: df
    Out[54]:
       ID    A   B   C   R1   R2
    0   1   A1  B1  C1  abc  ghi
    1   1   A1  B1  C2  def  jkl
    2   2   A2  B3  C1  mno  stu
    3   2   A2  B3  C2  pqr  vwx
    
    In [55]: grouped_df = df.groupby(['ID', 'A', 'B'])[["R1","R2"]].agg(tuple).reset_index()
    
    In [56]: grouped_df["R"] = grouped_df["R1"].astype(str) + " & " + grouped_df["R1"].astype(str)
    
    In [57]: grouped_df.drop(["R1","R2"],axis=1,inplace=True)
    
    In [58]: grouped_df
    Out[58]:
       ID    A   B                                R
    0   1   A1  B1  ('abc', 'def') & ('abc', 'def')
    1   2   A2  B3  ('mno', 'pqr') & ('mno', 'pqr')
    

    【讨论】:

      【解决方案2】:

      您可以使用agg、''.join 和filter:

      df.groupby(['ID','A','B'])
        .agg(lambda x: '('+', '.join(x)+')')
        .filter(like='R').agg('&'.join,1)
        .reset_index().rename(columns={0:'R'})
      

      详情

      df.groupby(['ID','A','B']).agg(lambda x: '('+', '.join(x)+')')
      #                 C          R1          R2
      #ID A  B                                   
      #1  A1 B1  (C1, C2)  (abc, def)  (ghi, jkl)
      #2  A2 B3  (C1, C2)  (mno, pqr)  (stu, vwx)
      
      
      df.groupby(['ID','A','B']).agg(lambda x: '('+', '.join(x)+')').filter(like='R')
      #                  R1          R2
      #ID A  B                         
      #1  A1 B1  (abc, def)  (ghi, jkl)
      #2  A2 B3  (mno, pqr)  (stu, vwx)
      
      
      df.groupby(['ID','A','B']).agg(lambda x: '('+', '.join(x)+')').filter(like='R').agg('&'.join,1).reset_index()
      #   ID   A   B                      0
      #0   1  A1  B1  (abc, def)&(ghi, jkl)
      #1   2  A2  B3  (mno, pqr)&(stu, vwx)
      
      
      df.groupby(['ID','A','B']).agg(lambda x: '('+', '.join(x)+')').filter(like='R').agg('&'.join,1).reset_index().rename(columns={0:'R'})
      #   ID   A   B                      R
      #0   1  A1  B1  (abc, def)&(ghi, jkl)
      #1   2  A2  B3  (mno, pqr)&(stu, vwx)
      

      【讨论】:

      • 优雅方案+1
      • 很好的解决方案!
      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多