我从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
答案 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)