Я постараюсь объяснить мою проблему как можно лучше. Но я новичок в Пандах, поэтому, пожалуйста, потерпите меня. У меня есть датафрейм 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
Я пытался изменить значения Seq Token
(User_First, Agent_Last ...) на основе вхождения User
и Agent
в Type
в каждой группе 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
(если Type=User
происходит в середине), Agent_Middle
(если Type=Agent
находится посередине), Agent_Last
(как объяснено выше: если Агент последний), то это было бы наиболее идеальным решением. Тем не менее, любые другие решения приветствуются.
Заранее спасибо!