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

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

提前致谢!

WeN*_*Ben 5

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)