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”。
我读过的网站:
我做错了什么? - 谢谢你。
答案 0 :(得分:3)
您的列bar
不是数字存在问题,因此聚合函数会省略它。
您可以查看省略列的dtype
- 不是数字:
print (df['bar'].dtype)
object
您可以查看automatic exclusion of nuisance columns。
解决方案是在将转化string
值汇总到numeric
之前,如果不可能,请添加NaN
和to_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