我想根据其他数据框中的匹配值填充数据框中的值

时间:2018-07-01 17:37:24

标签: python pandas if-statement

我正在编辑问题。我不想使用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() 

3 个答案:

答案 0 :(得分:4)

aggtransform可以使用:)

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

说明:

  1. 在第一列中用set_index创建MultiIndex,用GroupBy.cumcount创建的Series为新索引的每组计数值
  2. unstack重塑
  3. 通过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