如何使用pandas为group上的唯一值创建新列?

jjhzyzn0  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(98)

假设我有一个Pandas的框架,

id,date,school,name
1,2019-01-01,U,Doug
1,2021-01-01,U,Chris
1,2022-01-01,U,Chris
1,2023-01-01,U,Chris
1,2022-01-01,K,Liam
3,2024-01-01,M,Nancy
3,2024-01-01,M,Betty

我如何将它转换成一种格式,

id,school,name1,name2
1,U,Doug,Chris
1,K,Liam,''
3,M,Nancy,Betty

我想按ID和学校分组,并为每个唯一的名称创建新列。
下面是开始的代码。

import pandas as pd

d = {
    'id': [1,1,1,1,2,3,3],
    'date': ['2019-01-01', '2021-01-01', '2022-01-01', '2023-01-01', '2022-01-01', '2024-01-01', '2024-01-01'],
    'school': ['U','U','U','U','K','M','M'],
    'name': ['Doug','Chris','Chris','Chris','Liam','Nancy','Betty']
}
df = pd.DataFrame(d)
ffscu2ro

ffscu2ro1#

您可以使用此代码来获得ID和学校的唯一名称。然后将每行列表中的每个元素移动到单独的列中,最后重命名列。
df_grouped = df.groupby(['id', 'school'])['name'].unique().apply(pd.Series) df_grouped = df_grouped.rename(columns={x: f"name{x+1}" for x in df_grouped.columns}) df_grouped
输出量:
| ID|学校|name1| name2|
| --|--|--|--|
| 1 |U|道格|克里斯|
| 2 |K|利亚姆|楠|
| 3 |M|南希|贝蒂|
请注意,我们的输出并不完全匹配,因为在您的代码和您提供的示例之间,学校K的id有轻微的不匹配。

yks3o0rb

yks3o0rb2#

可能的解决方案:

cols = ['id', 'school']

g = df.groupby(cols)

out = (pd.concat([pd.concat(
    [x.loc[:, cols].head(1).reset_index(drop=True),
     pd.DataFrame(x['name'].unique()).T], axis=1) for _,x in g])
 .reset_index(drop=True))

out.columns = [x if i <=1 else f'name{i-1}' 
               for i, x in enumerate(out.columns)]

输出量:

id school  name1  name2
0   1      U   Doug  Chris
1   2      K   Liam    NaN
2   3      M  Nancy  Betty

相关问题