按一列分组并将 2 列应用到列表 pandas 中

Shu*_*m R 6 python pandas

我有一个数据框

id  name value    flag
1    a     x        F
1    b     y        A
2    c     z        B
3    d     m        Q
Run Code Online (Sandbox Code Playgroud)

如果我想按 id 分组并将值列作为列表放入新列中。

我可以

df.groupby('id')['value'].apply(list).reset_index()
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让我按“id”进行分组,但将 2 列(名称和值)放入列表中。

my desired output


id    col
 1    [[a,x],[b,y]]
 2    [[c,z]]
 3    [[d,m]]
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 7

将列转换为numpy arraybyvalues然后转换为lists ingroupby或单独转换为 new Series

df = df.groupby('id')
       .apply(lambda x: x[['name','value']].values.tolist())
       .reset_index(name='col')
print (df)
   id               col
0   1  [[a, x], [b, y]]
1   2          [[c, z]]
2   3          [[d, m]]
Run Code Online (Sandbox Code Playgroud)

或者:

s = pd.Series(df[['name','value']].values.tolist(), index=df.index)
df = s.groupby(df['id']).apply(list).reset_index(name='col')
print (df)
   id               col
0   1  [[a, x], [b, y]]
1   2          [[c, z]]
2   3          [[d, m]]
Run Code Online (Sandbox Code Playgroud)

另外,如果 s 中的元组没有问题list

s = pd.Series(list(zip(df['name'],df['value'])), index=df.index)
df = s.groupby(df['id']).apply(list).reset_index(name='col')
print (df)
   id               col
0   1  [(a, x), (b, y)]
1   2          [(c, z)]
2   3          [(d, m)]
Run Code Online (Sandbox Code Playgroud)


Flo*_*oor 5

zipapplyie中使用

df.groupby('id').apply(lambda x: list(zip(x['name'],x['value'])))

id
1    [(a, x), (b, y)]
2            [(c, z)]
3            [(d, m)]
dtype: object
Run Code Online (Sandbox Code Playgroud)

为了匹配您的确切输出,请使用to_frameiereset_index

df.groupby('id').apply(lambda x: list(zip(x['name'],x['value']))).to_frame('col').reset_index()

  id               col
0   1  [(a, x), (b, y)]
1   2          [(c, z)]
2   3          [(d, m)]
Run Code Online (Sandbox Code Playgroud)