Pandas dataframe: хранить строки с дубликатами - PullRequest
3 голосов
/ 20 апреля 2019

Этот вопрос несколько сложнее, чем Удалите повторяющиеся строки в кадре данных pandas на основе условия :

Вместо одного столбца 'value' у меня теперь есть два столбца 'valu1', 'valu2 ':

         t    valu1    valu2
2015-08-01        1       10
2015-08-01        2       11
2015-08-01        3       12
2015-09-31        4       15
2015-10-31        5       13

В приведенном выше кадре данных я хочу удалить повторяющиеся строки (т. е. строку, в которой повторяется столбец 't'), сохранив строку с более высоким значением в столбце valu1и более низкое значение в столбце value2.

Ожидаемый результат:

         t    valu1    valu2
2015-08-01        3       10
2015-09-31        4       15
2015-10-31        5       13

df.sort_values() и drop_duplicates с keep='last', упомянутыми в связанном вопросе, очевидно, неРабота.

Что-то, о чем я могу думать сейчас:

#Let's call the dataframe df
dups = df[df['t'].duplicated()]['t'].drop_duplicates()  #get duplicated dates
for d in dups:
    max_v1 = df[df['t'] == d]['valu1'].max()  #find the max of valu1 on day d
    min_v2 = df[df['t'] == d]['valu2'].min()  #find the min of valu2 on day d
    df[df['t'] == d]['valu1'] = max_v1        #set valu1 of day d to max_v1
    df[df['t'] == d]['valu2'] = min_v2        #set valu2 of day d to min_v2

df = df[~df.index.duplicated()]               #drop everything duplicated

Я думаю, что это должно сработать, но это действительно кажется простым, особенно мне действительно нужно сделать это для большого набора данных.Есть идеи, как мне подойти к этой проблеме?

1 Ответ

5 голосов
/ 20 апреля 2019

Я думаю, что вы ищете

df.groupby('t').agg({'valu1':'max','valu2':'min'}).reset_index()
            t  valu1  valu2
0  2015-08-01      3     10
1  2015-09-31      4     15
2  2015-10-31      5     13
...