Pandas groupby: изменить значения в одном столбце на основе значений в другом столбце - PullRequest
0 голосов
/ 31 октября 2018

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

Заранее спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...