Панды Groupby затем агрегировать результаты не повторяется? - PullRequest
0 голосов
/ 01 декабря 2018

Вот мои коды:

import pandas as pd
df = pd.DataFrame({'id': ['a', 'a', 'b', 'b', 'b'],
                   'v1': [1, 2, 3 ,4, 5],
                   'v2': [7, 6, 5, 4, 3],
                   'v3': [2, 4, 6, 8, 10]})

df.groupby('id').agg({'v1': ['count', 'sum'],
                      'v2': 'mean',
                      'v3': 'sum'})

Моя проблема в том, что каждый раз, когда я запускаю этот код (в блокноте jupyter), в результирующем фрейме данных используются разные порядки столбцов.Это ошибка в пандах?

Мой следующий шаг - переименовать получившийся фрейм данных, но без воспроизводимого порядка невозможно написать код для повторного использования.Как я мог обойти это?

Кстати, я использую Python 3.5 и панды 0.23.0.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

dict ключи не упорядочены в Python 3.5;это относится к dict s, используемым в pd.DataFrame() и .agg() в вашем коде.Вы можете использовать OrderedDict из модуля collections в стандартной библиотеке Python или использовать DataFrame.reindex() для реорганизации ваших столбцов и строк следующим образом:

import pandas as pd
df = pd.DataFrame({
    'id': ['a', 'a', 'b', 'b', 'b'],
    'v1': [1, 2, 3 ,4, 5],
    'v2': [7, 6, 5, 4, 3],
    'v3': [2, 4, 6, 8, 10]
})

df = df.set_index('id')
df = df.reindex(columns=['v1', 'v2', 'v3'])

df.groupby(level='id').agg({
    'v1': ['count', 'sum'],
    'v2': 'mean',
    'v3': 'sum'
})

DataFrame.reindex() большегенерал DataFrame.sort_index().

0 голосов
/ 01 декабря 2018

Я не получаю другой порядок, когда я запускаю код несколько раз.Однако, если вы столкнулись с этой проблемой, вы можете просто назвать желаемый порядок после вашего agg.Например, если вы хотите заказать v2, v3, v1, сделайте:

df.groupby('id',sort=False).agg({'v1': ['count', 'sum'],
                      'v2': 'mean',
                      'v3': 'sum'})[['v2','v3','v1']]

     v2  v3    v1    
   mean sum count sum
id                   
a   6.5   6     2   3
b   4.0  24     3  12

Или если вы просто хотите заказать тот же порядок, что и в исходном кадре данных:

df.groupby('id',as_index=False).agg({'v1': ['count', 'sum'],
                                     'v2': 'mean',
                                     'v3': 'sum'})[df.columns]

  id    v1       v2  v3
     count sum mean sum
0  a     2   3  6.5   6
1  b     3  12  4.0  24

но в целом, комментарий @ Allolz имеет смысл IMO, используя sort_index(1):

df.groupby('id').agg({'v1': ['count', 'sum'],
                      'v2': 'mean',
                      'v3': 'sum'}).sort_index(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...