Как найти первый экземпляр дублированных экземпляров и пометить его в другом столбце в Pandas? - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующие данные, отсортированные по ID, затем Date. Signal_Tag равно 1 при наличии положительного сигнала.

ID          Date    Signal_Tag 
1123    2020-01-03  0          
1123    2020-01-03  1          
1123    2020-06-09  1          
1123    2020-06-10  1          
2234    2019-01-01  0          
2234    2019-01-01  0          
2234    2019-01-01  1          
2234    2019-01-01  1          
2234    2019-01-02  1          
2234    2019-01-02  1          
2234    2019-01-02  0          

Мне нравится создавать новую переменную Daily_Signal_Tag, которая представляет первый дневной сигнал. Signal_Tag может иметь более одного 1 в один и тот же день для одного и того же человека. Но Daily_Signal_Tag может иметь только один 1 в один и тот же день для одного и того же человека.

Я понимаю, что в Pandas я могу сделать это за несколько шагов, то есть удалить дубликаты, агрегировать и повторно объединить, но я хотел бы сделать это, возможно, за один (или несколько) шагов, при этом имея возможность сгенерировать столбец Daily_Signal_Tag. Желаемые выходные данные выглядят следующим образом:

ID          Date    Signal_Tag      Daily_Signal_Tag
1123    2020-01-03  0               0
1123    2020-01-03  1               1
1123    2020-06-09  1               1
1123    2020-06-10  1               1
2234    2019-01-01  0               0
2234    2019-01-01  0               0
2234    2019-01-01  1               1
2234    2019-01-01  1               0
2234    2019-01-02  1               1
2234    2019-01-02  1               0
2234    2019-01-02  0               0

Ответы [ 2 ]

1 голос
/ 09 января 2020

Мы можем получить первый индекс каждого сигнала с помощью Groupby.idxmax, а затем удалить значения для всех других индексов с помощью Series.where

m = df.groupby(['ID', 'Date'])['Signal_Tag'].transform('idxmax')
df['Daily_Signal_Tag'] = df['Signal_Tag'].where(df.index == m, other = 0)
1 голос
/ 09 января 2020

Вы можете сделать pd.groupby() с этими 3 столбцами, взять первое значение из каждой группы и объединить его с исходным кадром данных (и заполнить NaN 0):

df = pd.concat([
        df,
        df.groupby(['ID', 'Date', 'Signal_Tag'])['Signal_Tag'].head(1).rename('Daily_Signal_Tag')
    ], axis=1).fillna(0).astype({"Daily_Signal_Tag": int})
print(df)

Отпечатки:

      ID        Date  Signal_Tag  Daily_Signal_Tag
0   1123  2020-01-03           0                 0
1   1123  2020-01-03           1                 1
2   1123  2020-06-09           1                 1
3   1123  2020-06-10           1                 1
4   2234  2019-01-01           0                 0
5   2234  2019-01-01           0                 0
6   2234  2019-01-01           1                 1
7   2234  2019-01-01           1                 0
8   2234  2019-01-02           1                 1
9   2234  2019-01-02           1                 0
10  2234  2019-01-02           0                 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...