我想打印用Pandas分组的结果。
我有一个数据框架:
import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)
A B
0 one 0
1 one 1
2 two 2
3 three 3
4 three 4
5 one 5
当按“A”分组后打印时,我有以下内容:
print(df.groupby('A'))
<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>
如何打印分组的数据框架?
如果我这样做:
print(df.groupby('A').head())
我获得的数据帧好像它没有分组:
A B
A
one 0 one 0
1 one 1
two 2 two 2
three 3 three 3
4 three 4
one 5 one 5
我期待的是:
A B
A
one 0 one 0
1 one 1
5 one 5
two 2 two 2
three 3 three 3
4 three 4
在Jupyter Notebook中,如果您执行以下操作,它将打印对象的漂亮分组版本。apply方法有助于创建多索引数据框架。
by = 'A' # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])
输出:
A B
A
one 0 one 0
1 one 1
5 one 5
three 3 three 3
4 three 4
two 2 two 2
如果您希望by列不出现在输出中,只需删除该列,如下所示。
df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])
输出:
B
A
one 0 0
1 1
5 5
three 3 3
4 4
two 2 2
在这里,我不确定为什么.iloc[:]不能在结尾工作而不是[:]。因此,如果将来由于更新(或当前)而出现一些问题,.iloc[:len(a)]也可以工作。
这是一个更好的通用答案。此函数将打印所有组名和值,或可选地选择一个或多个组进行显示。
def print_pd_groupby(X, grp=None):
'''Display contents of a Panda groupby object
:param X: Pandas groupby object
:param grp: a list with one or more group names
'''
if grp is None:
for k,i in X:
print("group:", k)
print(i)
else:
for j in grp:
print("group:", j)
print(X.get_group(j))
在您的示例案例中,下面是会话输出
In [116]: df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
In [117]: dfg = df.groupby('A')
In [118]: print_pd_groupby(dfg)
group: one
A B
0 one 0
1 one 1
5 one 5
group: three
A B
3 three 3
4 three 4
group: two
A B
2 two 2
In [119]: print_pd_groupby(dfg, grp = ["one", "two"])
group: one
A B
0 one 0
1 one 1
5 one 5
group: two
A B
2 two 2
这是一个更好的答案,因为函数是可重用的内容,把它放在你的包或函数集合中,永远不要重新编写那种“脚本化”的方法。
恕我直言,类似这样的东西应该是熊猫组的内置方法。