2016-05-27 5 views
1

У меня есть pandas DataFrame который выглядит следующим образом:Как выбрать мин запись пользователя в кадре данных панды во время учета для нескольких матчей, если вы хотите только один

  record_date   userid  id priority 
1 2016-05-27 02:00:39.600  1rhNGfQjU6 2718376  3 
2 2016-05-27 02:00:39.600  EveMoYR1gs 2718377  3 
3 2016-05-27 02:00:39.600  iVYGQgU3bX 2718378  3 
4 2016-05-27 02:00:39.600  adA9fRNIgo 2718379  3 
5 2016-05-27 02:00:39.600  rCDTlqTOXB 2718380  3 
6 2016-05-27 02:00:39.600  aBI6JkLyal 2718381  3 
7 2016-05-27 02:00:39.600  eiEct977ua 2718382  3 
8 2016-05-27 02:00:39.600  7XVMWZPcZL 2718383  3 
9 2016-05-27 02:00:39.600  GHajQM9UXN 2718384  3 

Это не очевидно, здесь, но может быть более одной записи на пользователя в день. Я пытаюсь найти способ идентифицировать id, который соответствует наименьшему значению приоритета для каждого пользователя в день. Я думаю, что у меня может возникнуть проблема с ломаной связью, потому что я пробовал предложения с другого сообщения SO (Python : Getting the Row which has the max value in groups using groupby), но эта логика, казалось бы, выберет все записи, равные min, тогда как мне действительно нужна только одна (в этом случае случайно выбранная) запись с минимальным приоритетом для каждого пользователя. Я знаю, что код выше не подходит для меня, потому что

len(set(df[indices]['userid'])) == len(df[indices]['userid']) 

False. Каков наилучший способ достичь этого? Я понимаю, почему приведенный выше код не работает (поскольку он возвращает True для тех записей, которые равны мин). Каков хороший способ сломать галстук?

ответ

1

Вам нужно groupby по столбцам userid и дате datetime по date с idxmin - получить все индексы с минимальным priority по группам и для выбора всех записей используйте loc:

df['record_date'] = pd.to_datetime(df.record_date) 

print (df.loc[df.priority.groupby([df.userid, df.record_date.dt.date]).idxmin()]) 

Пример:

import pandas as pd 

df = pd.DataFrame({'record_date': {1: '2016-05-27 02:00:39.600', 2: '2016-05-27 02:00:39.600', 3: '2016-05-27 02:00:39.600', 4: '2016-05-27 02:00:39.600', 5: '2016-05-27 02:00:39.600', 6: '2016-05-27 02:00:39.600', 7: '2016-05-27 02:00:39.600', 8: '2016-05-27 02:00:39.600', 9: '2016-05-27 02:00:39.600'}, 'id': {1: 2718376, 2: 2718377, 3: 2718378, 4: 2718379, 5: 2718380, 6: 2718381, 7: 2718382, 8: 2718383, 9: 2718384}, 'priority': {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}, 'userid': {1: '1rhNGfQjU6', 2: '1rhNGfQjU6', 3: '1rhNGfQjU6', 4: 'adA9fRNIgo', 5: 'adA9fRNIgo', 6: 'adA9fRNIgo', 7: 'eiEct977ua', 8: 'eiEct977ua', 9: 'eiEct977ua'}}) 
print (df) 
     id priority    record_date  userid 
1 2718376   1 2016-05-27 02:00:39.600 1rhNGfQjU6 
2 2718377   2 2016-05-27 02:00:39.600 1rhNGfQjU6 
3 2718378   3 2016-05-27 02:00:39.600 1rhNGfQjU6 
4 2718379   4 2016-05-27 02:00:39.600 adA9fRNIgo 
5 2718380   5 2016-05-27 02:00:39.600 adA9fRNIgo 
6 2718381   6 2016-05-27 02:00:39.600 adA9fRNIgo 
7 2718382   7 2016-05-27 02:00:39.600 eiEct977ua 
8 2718383   8 2016-05-27 02:00:39.600 eiEct977ua 
9 2718384   9 2016-05-27 02:00:39.600 eiEct977ua 

df['record_date'] = pd.to_datetime(df.record_date) 
print (df.loc[df.priority.groupby([df.userid, df.record_date.dt.day]).idxmin()]) 
     id priority    record_date  userid 
1 2718376   1 2016-05-27 02:00:39.600 1rhNGfQjU6 
4 2718379   4 2016-05-27 02:00:39.600 adA9fRNIgo 
7 2718382   7 2016-05-27 02:00:39.600 eiEct977ua 
+0

да большое спасибо! – helloB