如何使熊猫多索引数据框成为只有一列行的简单表?

时间:2018-12-02 19:34:12

标签: python pandas

我从http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html网站上比较了SQL和Pandas,然后发现在熊猫和sql中,groupby函数的结果是不同的。

例如:
在大熊猫中:

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 :(得分:0)

查看g.reset_index()方法。

这将解决多重索引问题。

对于列,我建议使用get_level_values()方法展平

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

pandas组也提供了文档说明:

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

as_index : boolean, default True. 

对于聚合输出,返回带有组标签的对象作为索引。仅与DataFrame输入有关。 as_index=False实际上是“ SQL风格”的分组输出

答案 1 :(得分:0)

我找到了答案。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitEmailList(int id)
{
  // to do : use id (which is int type_.
  // to do : return something
}

给予:

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)