Reputation: 177
Given the below csv file:
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
Need below output with a new column 'R':
ID A B R
-------------------------
1 A1 B1 (abc, def) & (ghi, jkl)
2 A2 B3 (mno, pqr) & (stu, vwx)
Assume only C1, C2 values for column C
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?
Upvotes: 0
Views: 76
Reputation: 6483
You could use agg
, ''.join
and filter
:
df.groupby(['ID','A','B'])
.agg(lambda x: '('+', '.join(x)+')')
.filter(like='R').agg('&'.join,1)
.reset_index().rename(columns={0:'R'})
Details
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)
Upvotes: 2
Reputation: 17408
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')
Upvotes: 1