我想用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
Run Code Online (Sandbox Code Playgroud)
在按'A'分组后打印时,我有以下内容:
print(df.groupby('A'))
<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>
Run Code Online (Sandbox Code Playgroud)
如何打印分组的数据框?
如果我做:
print(df.groupby('A').head())
Run Code Online (Sandbox Code Playgroud)
我获取数据帧,好像它没有分组:
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
Run Code Online (Sandbox Code Playgroud)
我期待的是:
A B
A
one 0 one 0
1 one 1
5 one 5
two 2 two 2
three 3 three 3
4 three 4
Run Code Online (Sandbox Code Playgroud)
Sur*_*rya 78
简单地说:
grouped_df = df.groupby('A')
for key, item in grouped_df:
print(grouped_df.get_group(key), "\n\n")
Run Code Online (Sandbox Code Playgroud)
这也有效,
grouped_df = df.groupby('A')
gb = grouped_df.groups
for key, values in gb.iteritems():
print(df.ix[values], "\n\n")
Run Code Online (Sandbox Code Playgroud)
对于选择性密钥分组: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")
Run Code Online (Sandbox Code Playgroud)
小智 47
如果您只是想找到一种显示方式,可以使用describe():
grp = df.groupby['colName']
grp.describe()
Run Code Online (Sandbox Code Playgroud)
这给你一个整洁的表.
QPe*_*ran 31
除了之前的答案:
以你为例,
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
Run Code Online (Sandbox Code Playgroud)
然后简单的1行代码
df.groupby('A').apply(print)
Run Code Online (Sandbox Code Playgroud)
小智 16
df.groupby('A').apply(display)
Run Code Online (Sandbox Code Playgroud)
提供整洁的格式
Dan*_*lan 12
我确认了head()
版本0.12和0.13之间的变化行为.对我来说这看起来像个错误.我创造了一个问题.
但是groupby操作实际上并不返回按组排序的DataFrame.这里的.head()
方法有点误导 - 这只是一个方便的功能,让你重新检查df
你分组的对象(在这种情况下).结果groupby
是单独的一种物体,一种GroupBy
物体.您必须apply
,transform
或者filter
返回DataFrame或Series.
如果你想要做的只是按A列中的值排序,你应该使用df.sort('A')
.
小智 12
在 Jupyter Notebook 中,如果您执行以下操作,它会打印出一个很好的对象分组版本。该apply
方法有助于创建多索引数据帧。
by = 'A' # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])
Run Code Online (Sandbox Code Playgroud)
输出:
A B
A
one 0 one 0
1 one 1
5 one 5
three 3 three 3
4 three 4
two 2 two 2
Run Code Online (Sandbox Code Playgroud)
如果您希望by
列不出现在输出中,只需删除列,就像这样。
df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])
Run Code Online (Sandbox Code Playgroud)
输出:
B
A
one 0 0
1 1
5 5
three 3 3
4 4
two 2 2
Run Code Online (Sandbox Code Playgroud)
在这里,我不确定为什么.iloc[:]
不工作而不是[:]
最后。因此,如果将来由于更新(或目前)而出现一些问题,.iloc[:len(a)]
也可以使用。
Sum*_*rel 10
另一个简单的选择:
for name_of_the_group, group in grouped_dataframe:
print (name_of_the_group)
print (group)
Run Code Online (Sandbox Code Playgroud)
此外,其他简单的替代方案可能是:
gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
Run Code Online (Sandbox Code Playgroud)
感谢 Surya 提供了很好的见解。我会清理他的解决方案,然后简单地做:
for key, value in df.groupby('A'):
print(key, value)
Run Code Online (Sandbox Code Playgroud)
在 GroupBy 对象上调用 list()
print(list(df.groupby('A')))
Run Code Online (Sandbox Code Playgroud)
给你:
[('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)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
109783 次 |
最近记录: |