Удалить и сохранить крупнейший в группе в Pandas Dataframe - PullRequest
0 голосов
/ 30 января 2019

У меня есть такой фрейм данных:

             userid           watched         timestamp
15           553938              M1           1499371200000
15390        527638              M2           1599731200000
15389        521638              M2           1399901200000
15388        521638              M3           1439841200000
15387        553938              M4           1499521200000

Для каждого пользователя мне нужно найти «последний» столбец под timestamp, удалить соответствующую строку и сохранить эту строку в новом фрейме данных,

Одним из способов сделать это может быть итерация по всем строкам с помощью DataFrame.iterrows () и обработка каждой строки.Однако мне интересно, есть ли какой-нибудь более эффективный способ выполнить эту задачу

1 Ответ

0 голосов
/ 30 января 2019

Вы можете сортировать по sort_values и фильтровать по логической маске, созданной duplicated и boolean indexing:

df = df.sort_values('timestamp', ascending=False)
mask = df.duplicated('userid')

df1 = df[mask]
df2 = df[~mask]

print (df1)
       userid watched      timestamp
15     553938      M1  1499371200000
15389  521638      M2  1399901200000

print (df2)
       userid watched      timestamp
15390  527638      M2  1599731200000
15387  553938      M4  1499521200000
15388  521638      M3  1439841200000

Или получите индексы по DataFrameGroupBy.idxmax и выберите по loc, для удаления индексов используйте drop:

idx = df.groupby('userid')['timestamp'].idxmax()

df1 = df.drop(idx)
#alternative
#df1 = df.loc[~df.index.isin(idx)]
df2 = df.loc[idx]

print (df1)
       userid watched      timestamp
15     553938      M1  1499371200000
15389  521638      M2  1399901200000

print (df2)
       userid watched      timestamp
15388  521638      M3  1439841200000
15390  527638      M2  1599731200000
15387  553938      M4  149952120000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...