Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用dataframe列连接groupby之后另一列的值_Python_Pandas_Dataframe - Fatal编程技术网

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