pandas聚合数据框只返回一个列

4

你好。

我有一个类似于这样的 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,我需要类似以下查询结果:select avg(foo), avg(bar) from dataframe group by id1, id2;(很抱歉,我更擅长SQL,对于Pandas还不太熟悉,但我现在需要它。)

我尝试了以下替代方法:

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

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

我阅读的网站:

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

2个回答

4

您的列bar存在问题,它不是数字类型,因此聚合函数会将其忽略。

您可以检查被忽略的列dtype - 它不是数字类型:

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

你可以查看自动排除烦人列
解决方案是在聚合之前将string值转换为numeric,如果不可能,则使用to_numeric和参数errors='coerce'添加NaN
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

但是如果数据混合 - 数字和字符串,可以使用replace

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

非常感谢。现在它运行良好。也许我忘记了 NULL 不同于 SQL 中的 NULL。 - dlg_
很高兴可以帮忙 ;) - jezrael

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接