我有一个数据框
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)
将列转换为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)
zip在applyie中使用
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)
| 归档时间: |
|
| 查看次数: |
2593 次 |
| 最近记录: |