ama*_*anb 6 python python-3.x pandas pandas-groupby
我会尽力解释我的问题。但我是 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
Run Code Online (Sandbox Code Playgroud)
Seq Token我一直在尝试根据每组中和User的出现情况来更改 (User_First, Agent_Last...) 的值。为了进一步说明,取每组的最后一行:AgentTypedf.groupby('Random_ID')
grouped = df.groupby('Random ID').last()
Run Code Online (Sandbox Code Playgroud)
这使:
Seq_ID Type Seq Token
Random_ID
8 5 Agent Second
13 10 Agent Second
Run Code Online (Sandbox Code Playgroud)
这里,如果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
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
grouped = df.groupby('Random_ID', as_index=False).last()['Type']
for i in grouped:
if i == 'Agent':
df['Seq Token'] = 'Agent_Final'
Run Code Online (Sandbox Code Playgroud)
但这会将所有项目分配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
Run Code Online (Sandbox Code Playgroud)
我读到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')
Run Code Online (Sandbox Code Playgroud)
你可以看到我已经实现了这个df。请注意,我使用该Seq_ID值来获取组中的第一行。
如果有一种链接方式np.where(),我可以指定Seq Token为User_First(与第一个相同),User_Middle(如果Type=User发生在中间),Agent_Middle(如果Type=Agent发生在中间),Agent_Last(如上所述:如果代理是最后一个),那么这将是最理想的解决方案。但是,也欢迎任何其他解决方案。
提前致谢!
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
Run Code Online (Sandbox Code Playgroud)