Pandas groupby:根据另一列中的值更改一列中的值

时间:2018-10-31 00:41:18

标签: python python-3.x pandas pandas-groupby

我将尽力解释我的问题。但是我是熊猫的新手,所以请多多包涵。我有一个熊猫数据框df

    Random_ID   Seq_ID  Type    Seq Token
0   8             1     User    First
1   8             2     Agent   Second
2   8             3     User    Second
3   8             4     User    Second
4   8             5     Agent   Second
5   13            1     User    First
6   13            2     Agent   Second
7   13            3     User    Second
8   13            4     Agent   Second
9   13            5     User    Second
10  13            6     Agent   Second
11  13            7     User    Second
12  13            8     Agent   Second
13  13            9     User    Second
14  13            10    Agent   Second

我一直试图根据每个组Seq TokenUserAgent的出现情况来更改Type(User_First,Agent_Last ...)的值df.groupby('Random_ID')中的。为了进一步说明,请每组最后一行:

grouped = df.groupby('Random ID').last()

给出:

          Seq_ID       Type     Seq Token
Random_ID           
8          5           Agent    Second
13         10          Agent    Second

在这里,如果Type=Agent,则Seq token应该是Agent_Final。然后,df应该看起来像:

    Random_ID   Seq_ID  Type    Seq Token
0   8             1     User    First
1   8             2     Agent   Second
2   8             3     User    Second
3   8             4     User    Second
4   8             5     Agent   Agent_Final
5   13            1     User    First
6   13            2     Agent   Second
7   13            3     User    Second
8   13            4     Agent   Second
9   13            5     User    Second
10  13            6     Agent   Second
11  13            7     User    Second
12  13            8     Agent   Second
13  13            9     User    Second
14  13            10    Agent   Agent_Final

我尝试了以下操作:

grouped = df.groupby('Random_ID', as_index=False).last()['Type']
for i in grouped:
    if i == 'Agent':
        df['Seq Token'] =  'Agent_Final'

但是这会将Seq token中的所有项目分配为'Agent_Final'

     Random_ID  Seq_ID  Type    Seq Token
0       8         1     User    Agent_Final
1       8         2     Agent   Agent_Final
2       8         3     User    Agent_Final
3       8         4     User    Agent_Final
4       8         5     Agent   Agent_Final

我了解了groupby,它创建了原始df的副本,并且除非有人明确更改df[column],否则不允许对其进行更改。我希望这是有道理的。

我已经设法使用"First"将第一行“组值”设置为np.where(),如下所示:

df['Seq Token'] = np.where((np.logical_and(np.equal(df['Type'],'User'), np.equal(df['Seq_ID'],1))), 'First', 'Second')

您可以看到我已经在df中实现了此功能。请注意,我使用了Seq_ID值来获取组中的第一行。

如果有一种链接np.where()的方式,例如我可以将Seq Token分配为User_First(与First相同),则User_Middle(如果{{1 }}出现在中间),Type=User(如果Agent_Middle出现在中间),Type=Agent(如上所述):如果Agent在最后,那么这将是最理想的解决方案。但是,也欢迎任何其他解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

IIUC,您可以在index之后使用groupby分配

s=df.groupby('Random_ID').tail(1).loc[lambda x : x.Type=='Agent'].index
s
Out[62]: Int64Index([4, 14], dtype='int64')
df.loc[s,'SeqToken']='Agent_Final'
df
Out[64]: 
    Random_ID  Seq_ID   Type     SeqToken
0           8       1   User        First
1           8       2  Agent       Second
2           8       3   User       Second
3           8       4   User       Second
4           8       5  Agent  Agent_Final
5          13       1   User        First
6          13       2  Agent       Second
7          13       3   User       Second
8          13       4  Agent       Second
9          13       5   User       Second
10         13       6  Agent       Second
11         13       7   User       Second
12         13       8  Agent       Second
13         13       9   User       Second
14         13      10  Agent  Agent_Final