pandas聚合数据帧只返回一列

时间:2017-06-15 12:11:26

标签: python pandas group-by aggregate

Hy那里。

我有一个像这样的pandas DataFrame(df):

     foo  id1  bar  id2
0    8.0   1  NULL   1
1    5.0   1  NULL   1
2    3.0   1  NULL   1
3    4.0   1     1   2
4    7.0   1     3   2
5    9.0   1     4   3
6    5.0   1     2   3
7    7.0   1     3   1
...

我想按id1和id2进行分组,并尝试获取foo和bar的平均值。

我的代码:

res = df.groupby(["id1","id2"])["foo","bar"].mean()

我得到的几乎是我的期望:

            foo
id1 id2          
1  1   5.750000
   2   7.000000
2  1   3.500000
   2   1.500000
3  1   6.000000
   2   5.333333

“foo”列中的值正是我要查找的平均值(均值)但我的列“bar”在哪里?

所以,如果它是SQL,我正在寻找像以下结果: “从数据集组中选择avg(foo),avg(bar),按id1,id2; ” (对不起,但我更像是一个sql人和熊猫新手,但我现在需要它。)

我选择了尝试:

groupedFrame = res.groupby(["id1","id2"])
aggrFrame = groupedFrame.aggregate(numpy.mean)

这给了我完全相同的结果,仍然缺少列“bar”。

我读过的网站:

我做错了什么? - 谢谢你。

2 个答案:

答案 0 :(得分:3)

您的列bar不是数字存在问题,因此聚合函数会省略它。

您可以查看省略列的dtype - 不是数字:

print (df['bar'].dtype)
object

您可以查看automatic exclusion of nuisance columns

解决方案是在将转化string值汇总到numeric之前,如果不可能,请添加NaNto_numeric以及参数errors='coerce'

df['bar'] = pd.to_numeric(df['bar'], errors='coerce')
res = df.groupby(["id1","id2"])["foo","bar"].mean()
print (res)
          foo  bar
id1 id2           
1   1    5.75  3.0
    2    5.50  2.0
    3    7.00  3.0

但如果有混合数据 - 使用strings可以使用数字replace

df['bar'] = df['bar'].replace("NULL", np.nan)

答案 1 :(得分:1)

如前所述,您应该在取平均值之前替换NULL值

df.replace("NULL",-1).groupby(["id1","id2"])["foo","bar"].mean()

输出

id1 id2 foo  bar
1   1   5.75 3.0
1   2   5.5  2.0
1   3   7.0  3.0