我从这样的输入数据开始
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
打印时显示如下:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
分组很简单:
g1 = df1.groupby( [ "Name", "City"] ).count()
和打印产生一个 GroupBy
对象:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
但我最终想要的是另一个包含GroupBy对象中所有行的DataFrame对象 . 换句话说,我希望得到以下结果:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
我无法在pandas文档中看到如何实现这一点 . 任何提示都会受到欢迎 .
8 回答
简单来说,这应该完成任务:
这里,grouped_df.size()提取唯一的groupby计数,reset_index()方法重置你想要的列的名称 . 最后,调用pandas Dataframe()函数来创建DataFrame对象 .
我发现这对我有用 .
我想略微改变Wes给出的答案,因为版本0.16.2需要
as_index=False
. 如果不设置它,则会得到一个空数据帧 .Source:
编辑:
在版本
0.17.1
及更高版本中,您可以在count中使用subset
,在size中使用参数name
的reset_index:count
和size
之间的区别在于size
计算NaN值,而count
则不计算 .这些解决方案只对我有用,因为我正在进行多次聚合 . 以下是我想要转换为数据帧的分组示例输出:
因为我想要的数量超过reset_index()提供的数量,所以我写了一个手动方法,将上面的图像转换为数据帧 . 我知道这不是最狡猾/大熊猫的方式,因为它非常冗长和明确,但它只是我需要的 . 基本上,使用上面解释的reset_index()方法启动“脚手架”数据框,然后循环分组数据框中的组配对,检索索引,针对未分组的数据帧执行计算,并在新的聚合数据框中设置值 .
如果字典不是你的东西,计算可以在for循环中内联应用:
以下解决方案可能更简单:
我已经汇总了数量明智的数据并存储到数据帧
g1
这是一个DataFrame . 它有一个分层索引,但是:也许你想要这样的东西?
或类似的东西:
也许我误解了这个问题,但如果你想将groupby转换回数据帧,你可以使用.to_frame() . 当我这样做时我想重置索引,所以我也包括了那个部分 .
示例代码与问题无关