在csv,pandas中的groupby之后创建自定义列

Posted

技术标签:

【中文标题】在csv,pandas中的groupby之后创建自定义列【英文标题】:Creating a custom column after groupby in csv, pandas 【发布时间】: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?

【问题讨论】:

【参考方案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''.joinfilter

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 很好的解决方案!

以上是关于在csv,pandas中的groupby之后创建自定义列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 在 groupby 和 nlargest 之后创建额外(重复)索引

在groupby之后访问pandas中的分层列

Python for DF 基于 Excel 和 CSV 的不同结果 pandas Groupby

pandas-09 pd.groupby()的用法

将 pandas groupby 对象保存到 csv 文件中

在 groupby 之后在 pandas DataFrame 的列表变量中创建一个列表