我将尽力解释我的问题。但是我是熊猫的新手,所以请多多包涵。我有一个熊猫数据框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 Token
中User
和Agent
的出现情况来更改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在最后,那么这将是最理想的解决方案。但是,也欢迎任何其他解决方案。
谢谢!
答案 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