Cle*_*leb 3 python dataframe pandas
我有一个这样的数据框:
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
Run Code Online (Sandbox Code Playgroud)
现在,我想对列进行分组,group并values使用中的条目来加入相应的值joiner。所以像这样:
df.groupby('group')['values'].transform(" - ".join)
0 x - r
1 y - z
2 y - z
3 t
4 x - r
Run Code Online (Sandbox Code Playgroud)
只是" - "它应该使用中的相应值df['joiner']。
我该怎么做?
预期结果将是:
0 x j1 r
1 y j2 z
2 y j2 z
3 t
4 x j1 r
Run Code Online (Sandbox Code Playgroud)
我们可以安全地假定该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))
Run Code Online (Sandbox Code Playgroud)
group values joiner new
0 A x j1 x j1 r
1 B y j2 y j2 z
2 B z j2 y j2 z
3 C t j3 t
4 A r j1 x j1 r
Run Code Online (Sandbox Code Playgroud)
使用映射器和 pd.Series.str.cat
mapper = df.set_index('group').joiner.to_dict()
df.groupby('group').values.transform(lambda s: s.str.cat(sep=f' {mapper[s.name]} '))
Run Code Online (Sandbox Code Playgroud)
group values joiner joined
0 A x j1 x j1 r
1 B y j2 y j2 z
2 B z j2 y j2 z
3 C t j3 t
4 A r j1 x j1 r
Run Code Online (Sandbox Code Playgroud)