我想用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
答案 0 :(得分:61)
简单地说:
grouped_df = df.groupby('A')
for key, item in grouped_df:
print(grouped_df.get_group(key), "\n\n")
这也有效,
grouped_df = df.groupby('A')
gb = grouped_df.groups
for key, values in gb.iteritems():
print(df.ix[values], "\n\n")
对于选择性密钥分组:使用key_list_from_gb
在gb.keys()
中插入所需的密钥:例如,
gb = grouped_df.groups
gb.keys()
key_list_from_gb = [key1, key2, key3]
for key, values in gb.items():
if key in key_list_from_gb:
print(df.ix[values], "\n")
答案 1 :(得分:40)
如果您只是想找到一种显示方法,可以使用describe():
grp = df.groupby['colName']
grp.describe()
这给你一个整洁的表。
答案 2 :(得分:15)
除了以前的答案:
以您的示例为例,
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
然后是简单的1行代码
df.groupby('A').apply(print)
答案 3 :(得分:10)
我确认head()
的行为在版本0.12和0.13之间发生了变化。对我来说这看起来像个错误。我创建了一个issue。
但是groupby操作实际上并不返回按组排序的DataFrame。 .head()
方法在这里有点误导 - 这只是一个方便的功能,让您重新检查您分组的对象(在本例中为df
)。 groupby
的结果是单独的对象,GroupBy
对象。您必须apply
,transform
或filter
才能返回DataFrame或系列。
如果您只想按照A列中的值进行排序,则应使用df.sort('A')
。
答案 4 :(得分:7)
此外,其他简单的替代方案可能是:
gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
答案 5 :(得分:5)
在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)]
也可以使用。
答案 6 :(得分:4)
在GroupBy对象上调用list()
print(list(df.groupby('A')))
给您
[('one', A B
0 one 0
1 one 1
5 one 5), ('three', A B
3 three 3
4 three 4), ('two', A B
2 two 2)]
答案 7 :(得分:3)
另一个简单的选择:
for name_of_the_group, group in grouped_dataframe:
print (name_of_the_group)
print (group)
答案 8 :(得分:2)
您不能直接通过print语句查看groupBy数据,但可以使用for循环遍历该组来查看 尝试使用此代码查看按数据分组
group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
print(A)
print(A_df)
将其作为分组结果尝试后将获得输出
我希望对您有帮助
答案 9 :(得分:2)
df.groupby(“您要分组的键”)。apply(打印)
正如另一位成员所提到的,这是可视化groupby对象的最简便方法。
答案 10 :(得分:1)
这是一个更好的通用答案。此函数将打印所有组名和值,或者可选择一个或多个组进行显示。
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
这是一个更好的答案,因为函数是可重用的内容,将其放入您的包或函数集合中,并且永远不要再重新编写那种“脚本式”方法。
恕我直言,这样的事情应该是 Pandas groupby 中的内置方法。
答案 11 :(得分:1)
df.groupby('A').apply(display)
提供整洁的格式
答案 12 :(得分:0)
我发现了一个棘手的方法,只是为了头脑风暴,请参见代码:
df['a'] = df['A'] # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)
输出:
B
A a
one one 0
one 1
one 5
three three 3
three 4
two two 2
优点很容易打印,因为它返回一个数据框而不是Groupby Object。输出看起来不错。 缺点是会创建一系列冗余数据。
答案 13 :(得分:0)
在python 3中
k = None
for name_of_the_group, group in dict(df_group):
if(k != name_of_the_group):
print ('\n', name_of_the_group)
print('..........','\n')
print (group)
k = name_of_the_group
以更具交互性的方式
答案 14 :(得分:0)
感谢Surya的深入见解。我会清理他的解决方案,然后简单地做:
for key, value in df.groupby('A'):
print(key, value)
答案 15 :(得分:0)
您只需要将 DataFrameGroupBy 对象转换为列表,您就可以简单地打印它.. ls_grouped_df = list(df.groupby('A')) 打印(ls_grouped_df)
答案 16 :(得分:-2)
打印分组的df的所有(或任意多行):
import pandas as pd
pd.set_option('display.max_rows', 500)
grouped_df = df.group(['var1', 'var2'])
print(grouped_df)