Определите первый ненулевой элемент в группе, состоящей из нескольких столбцов в пандах - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть датафрейм, который выглядит следующим образом. Самый правый столбец - это мой нужный столбец:

Group1  Group2  Value   Target_Column
1        3         0      0
1        3         1      1
1        4         1      1
1        4         1      0
2        5         5      5
2        5         1      0
2        6         0      0
2        6         1      1
2        6         9      0

Как определить первое ненулевое значение в группе, которая состоит из двух столбцов (Group1 & Group2), а затем создать столбец, который показывает первое ненулевое значение и показывает все остальное как нули?

Этот вопрос очень похож на заданный ранее здесь: Определить первый ненулевой элемент в группе в пандах но это решение дает ошибку для групп, основанных на нескольких столбцах.

Я пытался:

import pandas as pd
dt = pd.DataFrame({'Group1': [1,1,1,1,2,2,2,2,2], 'Group2': [3,3,4,4,5,5,6,6,6],  'Value': [0,1,1,1,5,1,0,1,9]})
dt['Newcol']=0
dt.loc[dt.Value.ne(0).groupby(dt['Group1','Group2']).idxmax(),'Newcol']=dt.Value

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Число может быть отключено, так как, когда есть только два одинаковых значения, я не знаю, какое вам нужно.

Использование настроек user3483203

df['flag'] = df.Value.ne(0)

df['Target']=df.sort_values(['flag'],ascending=False).drop_duplicates(['Group1','Group2']).Value

df['Target'].fillna(0,inplace=True)
df
Out[20]: 
   Group1  Group2  Value  Target_Column  Target
0       1       3      0              0     0.0
1       1       3      1              1     1.0
2       1       4      1              1     1.0
3       1       4      1              0     0.0
4       2       5      5              5     5.0
5       2       5      1              0     0.0
6       2       6      0              0     0.0
7       2       6      1              1     1.0
0 голосов
/ 01 сентября 2018

Настройка

df['flag'] = df.Value.ne(0)

Использование numpy.where и assign:

df.assign(
    target=np.where(df.index.isin(df.groupby(['Group1', 'Group2']).flag.idxmax()),
    df.Value, 0)
).drop('flag', 1)

Использование loc и assign

df.assign(
    target=df.loc[df.groupby(['Group1', 'Group2']).flag.idxmax(), 'Value']
).fillna(0).astype(int).drop('flag', 1)

Оба производят:

   Group1  Group2  Value  target
0       1       3      0       0
1       1       3      1       1
2       1       4      1       1
3       1       4      1       0
4       2       5      5       5
5       2       5      1       0
6       2       6      0       0
7       2       6      1       1
8       2       6      9       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...