Как сделать многоиндексный фрейм данных Pandas простой таблицей, содержащей только строки из одного столбца? - PullRequest
0 голосов
/ 02 декабря 2018

Я сравнивал SQL с Pandas с веб-сайта http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html, затем я обнаружил, что результат работы групповых функций различается в pandas и sql.

Например:
В pandas:

import pandas as pd
import numpy as np

df = pd.read_csv('https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv')
df.head()

g = df.groupby(['smoker', 'day']).agg({'tip': [np.size, np.mean]})
print(g)

Дает:

             tip          
             size      mean
smoker day                 
No     Fri    4.0  3.187500
       Sat   45.0  3.361556
       Sun   57.0  3.386491
       Thur  45.0  3.122667
Yes    Fri   15.0  3.114000
       Sat   41.0  3.048049
       Sun   19.0  3.595789
       Thur  17.0  3.030000

Как получить вывод, подобный указанному в SQL?

  smoker   day  tip_size  tip_mean
0     No   Fri         4  2.812500
1     No   Sat        45  3.102889
2     No   Sun        57  3.167895
3     No  Thur        45  2.673778
4    Yes   Fri        15  2.714000
5    Yes   Sat        41  2.701707
6    Yes   Sun        19  3.516842
7    Yes  Thur        17  3.030000

Ответы [ 2 ]

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

Я узнал ответ.

g = g.reset_index()
print(g)

дает:

  smoker   day   tip          
                size      mean
0     No   Fri   4.0  2.812500
1     No   Sat  45.0  3.102889
2     No   Sun  57.0  3.167895
3     No  Thur  45.0  2.673778
4    Yes   Fri  15.0  2.714000
5    Yes   Sat  42.0  2.875476
6    Yes   Sun  19.0  3.516842
7    Yes  Thur  17.0  3.030000

Теперь g.column.values дает:

array([('smoker', ''), ('day', ''), ('tip', 'size'), ('tip', 'mean')],
      dtype=object)

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

g.columns = ['_'.join(e)  if e[1] else ''.join(e)  for e in g.columns.values]
print(g)

Это дает:

  smoker   day  tip_size  tip_mean
0     No   Fri       4.0  2.812500
1     No   Sat      45.0  3.102889
2     No   Sun      57.0  3.167895
3     No  Thur      45.0  2.673778
4    Yes   Fri      15.0  2.714000
5    Yes   Sat      42.0  2.875476
6    Yes   Sun      19.0  3.516842
7    Yes  Thur      17.0  3.030000
0 голосов
/ 02 декабря 2018

Изучите метод g.reset_index().

Это решит проблему с мультииндексом.

Для столбцов я бы предложил сгладить, используя get_level_values() метод

g.columns = g.columns.get_level_values(1) + '_' + g.get_level_values(0)

Также обратите внимание на группу панд по документации:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html

as_index : boolean, default True. 

Для агрегированного вывода вернуть объект с метками группы в качестве индекса.Относится только к вводу данных.as_index=False фактически является сгруппированным выводом в стиле SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...