我有一个熊猫数据框,如下所示。

player  count1  count2  text
A       1       1       X
A       2       1       Y
A       3       1       Z
A       4       2       D
A       5       2       E
B       1       1       F
B       2       2       G
B       3       2       H
B       4       2       J

player包含名称,count1是累积和,列count2包含其他计数,列text包含一些文本。
我现在要创建两个包含count1text值的新列,其中count2列首先包含2值。
因此,结果应该是这样的:
player  count1  count2  text    new new2
A       1       1       X       4   D
A       2       1       Y       4   D
A       3       1       Z       4   D
A       4       2       D       4   D
A       5       2       E       4   D
B       1       1       F       2   G
B       2       2       G       2   G
B       3       2       H       2   G
B       4       2       J       2   G

我已经问了一个类似的问题,但是在哪里只需要添加一个新的专栏[这里][1]。
答案是通过map使用Series
s = df[df['count2'] == 2].drop_duplicates(['player']).set_index('player')['count1']
df['new'] = df['player'].map(s)

但是,当我尝试将此方法应用于两列时,它不起作用。
我就这样试试:
s = df[df['count2'] == 2].drop_duplicates(['player']).set_index('player')[['count1', 'text']]
df[['new', 'new2']] = df['player'].map(s)

这会产生以下错误:
TypeError:“DataFrame”对象不可调用
我怎样才能让它工作?

最佳答案

您可以在count2==2时过滤,按玩家删除重复项,然后将结果合并回原来的DF on player,例如:

new = df.merge(
    df.loc[df.count2 == 2, ['player', 'count1', 'text']]
    .drop_duplicates(subset=['player']),
    on='player'
)

它给你:
  player  count1_x  count2 text_x  count1_y text_y
0      A         1       1      X         4      D
1      A         2       1      Y         4      D
2      A         3       1      Z         4      D
3      A         4       2      D         4      D
4      A         5       2      E         4      D
5      B         1       1      F         2      G
6      B         2       2      G         2      G
7      B         3       2      H         2      G
8      B         4       2      J         2      G

10-07 18:23