gpt4 book ai didi

python - Pandas groupby : change values in one column based on values in another column

转载 作者:行者123 更新时间:2023-12-01 08:51:39 24 4
gpt4 key购买 nike

我会尽力解释我的问题。但我是 Pandas 新手,所以请耐心等待。我有一个 Pandas 数据框 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

我一直在尝试根据 UserAgent 的出现来更改 Seq Token(User_First、Agent_Last...)的值> 在df.groupby('Random_ID')每组中的Type中。为了进一步说明,取每组的最后一行:

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].我希望这是有道理的。

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

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(相同作为第一个),User_Middle(如果Type=User出现在中间),Agent_Middle(如果Type=Agent发生在中间),Agent_Last(如上所述:如果 Agent 是最后一个),那么这将是最理想的解决方案。但是,也欢迎任何其他解决方案。

提前致谢!

最佳答案

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

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

关于python - Pandas groupby : change values in one column based on values in another column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com