我的数据框如下所示:
ID Class
0 9
1 8
1 6
2 6
2 2
3 15
3 1
3 8
我想要做的是以下面的方式合并具有相同ID值的行:
ID Class1 Class2 Class3
0 9
1 8 6
2 6 2
3 15 1 8
因此,对于每个存在多次的ID,我想创建新列并将值从行移动到这些列。最快的方法是什么?我尝试使用groupby
,但它没有给我适当的结果。
答案 0 :(得分:2)
将set_index
与cumcount
一起用于新列,按unstack
重新整形,最后按add_prefix
重命名列:
df = df.set_index(['ID', df.groupby('ID').cumcount()])['Class']
.unstack()
.add_prefix('Class')
.reset_index()
print (df)
ID Class0 Class1 Class2
0 0 9.0 NaN NaN
1 1 8.0 6.0 NaN
2 2 6.0 2.0 NaN
3 3 15.0 1.0 8.0
另一个解决方案是每个组创建list
,然后按构造函数创建新的DataFrame
:
s = df.groupby('ID')['Class'].apply(list)
df = pd.DataFrame(s.values.tolist(), index=s.index)
.add_prefix('Class')
.reset_index()
print (df)
ID Class0 Class1 Class2
0 0 9 NaN NaN
1 1 8 6.0 NaN
2 2 6 2.0 NaN
3 3 15 1.0 8.0
编辑:
df = df.set_index('ID')
df1=pd.get_dummies(df['Class']).reindex(columns=range(17), fill_value=0).add_prefix('Class')
df1 = df1.groupby(level=0).max().reset_index()
print (df1)
ID Class0 Class1 Class2 Class3 Class4 Class5 Class6 Class7 Class8 \
0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 1 0 1
2 2 0 0 1 0 0 0 1 0 0
3 3 0 1 0 0 0 0 0 0 1
Class9 Class10 Class11 Class12 Class13 Class14 Class15 Class16
0 1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 1 0
答案 1 :(得分:0)
或者你可以尝试
df.groupby('ID').Class.apply(lambda x : x.tolist()).to_frame()['Class'].apply(pd.Series).add_prefix('Class_').fillna(' ')
Out[602]:
Class_0 Class_1 Class_2
ID
0 9.0
1 8.0 6
2 6.0 2
3 15.0 1 8