восстановить индекс после groupby.size () в пандах - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно восстановить индекс после groupby.size() или сделать его доступным, но вроде как он не работает с .size().Я прочитал сообщение Pandas от StackOverflow - Восстановление индекса после Groupby , но все ответы на справку идут строго с использованием max() функции агрегации, как насчет других?

Немного примеров кода:

df
Out[39]:
      product_id
order_id    
2103    7546
2103    8278
2103    6790
2104    7546
2104    8278
2104    6790


df.groupby('product_id', as_index=True).size()
Out[67]:
product_id
3587      1
3590      1
3680      2
6735      5
6744      1
6759      6

df.groupby('product_id', as_index=False).size()
Out[68]:
product_id
3587      1
3590      1
3680      2
6735      5
6744      1
6759      6

Как вы можете видеть после изменения параметра as_index на True или False, ничего не происходит с индексом.Но все работает с функцией .max() aggr.Так или иначе, вопрос в том, как восстановить индекс после groupby.size().

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

    product_id
index   
2103 3587      1
2104 3590      1
2188 3680      2
2188 6735      5
2188 6744      1
2188 6759      6

1 Ответ

0 голосов
/ 15 мая 2018

Как только вы выполните groupby, исходный индекс будет потерян. Это связано с тем, что внутренне pandas использует столбец (и) группировщика в качестве индекса.

Что вы можете сделать, это поднять свой индекс в столбец, подсчитать число product_id с помощью предварительно рассчитанного ряда, а затем снова установить индекс.

value_counts может использоваться вместо groupby.size для этой задачи.

df = pd.DataFrame({'product_id': [7546, 8278, 6790, 7546, 8278, 6790]},
                  index=[2103, 2103, 2103, 2104, 2104, 2104])

c = df.product_id.value_counts()

res = df.reset_index()
res['count'] = res['product_id'].map(c)
res = res.set_index('index')

print(res)

       product_id  count
index                   
2103         7546      2
2103         8278      2
2103         6790      2
2104         7546      2
2104         8278      2
2104         6790      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...