Python 使用dataframe列连接groupby之后另一列的值
我有这样一个数据帧:Python 使用dataframe列连接groupby之后另一列的值,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧: import pandas as pd df = pd.DataFrame( { 'group': list('ABBCA'), 'values': list('xyztr'), 'joiner': ['j1', 'j2', 'j2', 'j3', 'j1'] } ) group values joiner 0 A x j1 1 B y j2 2
import pandas as pd
df = pd.DataFrame(
{
'group': list('ABBCA'),
'values': list('xyztr'),
'joiner': ['j1', 'j2', 'j2', 'j3', 'j1']
}
)
group values joiner
0 A x j1
1 B y j2
2 B z j2
3 C t j3
4 A r j1
df.groupby('group')['values'].transform(" - ".join)
0 x - r
1 y - z
2 y - z
3 t
4 x - r
df.groupby(['group', 'joiner'])['values']\
.transform(lambda gr: (' ' + gr.name[1] + ' ').join(gr))
现在,我想按列分组
,并使用joiner
中的条目在values
中加入相应的值。比如说:
import pandas as pd
df = pd.DataFrame(
{
'group': list('ABBCA'),
'values': list('xyztr'),
'joiner': ['j1', 'j2', 'j2', 'j3', 'j1']
}
)
group values joiner
0 A x j1
1 B y j2
2 B z j2
3 C t j3
4 A r j1
df.groupby('group')['values'].transform(" - ".join)
0 x - r
1 y - z
2 y - z
3 t
4 x - r
df.groupby(['group', 'joiner'])['values']\
.transform(lambda gr: (' ' + gr.name[1] + ' ').join(gr))
只是它应该使用df['joiner']
中的相应值
我该怎么做
预期结果将是:
0 x j1 r
1 y j2 z
2 y j2 z
3 t
4 x j1 r
我们可以安全地假设joiner
值与group
列一致(否则groupby
将失败)。这里有一种方法:
m=df.groupby('group').agg({'values':list,'joiner':'first'})
s=pd.Series([f' {b} '.join(a) for a,b in zip(m['values'],m['joiner'])],index=m.index)
final=df.assign(new=df.group.map(s))
使用映射器和
试着这样做:
import pandas as pd
df = pd.DataFrame(
{
'group': list('ABBCA'),
'values': list('xyztr'),
'joiner': ['j1', 'j2', 'j2', 'j3', 'j1']
}
)
group values joiner
0 A x j1
1 B y j2
2 B z j2
3 C t j3
4 A r j1
df.groupby('group')['values'].transform(" - ".join)
0 x - r
1 y - z
2 y - z
3 t
4 x - r
df.groupby(['group', 'joiner'])['values']\
.transform(lambda gr: (' ' + gr.name[1] + ' ').join(gr))
这是另一种方法
s=df.groupby('group').apply(lambda x: (' '+x['joiner'].iloc[0]+ ' ').join(x['values'])).reindex(df.group)
group
A x j1 r
B y j2 z
B y j2 z
C t
A x j1 r
dtype: object
df['new']=s.values