我正在编辑问题。我不想使用groupby来使用组值。 如果有人可以通过以下方式帮助您转换数据,我将不胜感激:
我有一个数据帧,如下所示:
df1:
col1 col2
------------
VG 12
G 11
A 10
P 06
VP 0
我想要新的数据框,例如:
df2:
VG G A P VP
---------------------
12 11 10 06 0
我尝试使用if条件实现此目标,但出现以下错误: 代码:
if df1.Score=='VG':
df2['VG']=df1.loc[df1['col1'] == 'VG', 'col2']
The truth value of a Series is ambiguous. Use a.empty, a.bool(),
a.item(), a.any() or a.all()
答案 0 :(得分:4)
agg
和transform
可以使用:)
df.groupby('col1').agg(list).col2.transform(pd.Series).T.fillna(0)
A G P VG VP
0 10.0 11.0 6.0 12.0 0.0
1 50.0 0.0 0.0 53.0 0.0
答案 1 :(得分:1)
感谢@ user2285236改善答案:
s = df1.groupby('col1').cumcount()
df = (df1.set_index(['col1', s])['col2']
.unstack(level=0, fill_value=0)
.rename_axis(None, 1))
print (df)
A G P VG VP
0 10 11 6 12 0
1 50 0 0 53 0
说明:
set_index
创建MultiIndex
,用GroupBy.cumcount
创建的Series
为新索引的每组计数值unstack
重塑rename_axis
清理数据答案 2 :(得分:0)
如果所有其他方法均失败,则还有很长的路要走
s = [pd.Series(g.loc[g['col2'] != 0, 'col2'].values, name=k) \
for k, g in df.groupby('col1')]
res = pd.concat(s, axis=1, ignore_index=False).fillna(0)
print(res)
A G P VG VP
0 10 11.0 6.0 12 0.0
1 50 0.0 0.0 53 0.0