使用mean()的交叉表在Decimal对象上不起作用



我想用pandas.crosstab来计算子组的mean()。取值类型为decimal.Decimal

正如你可以看到在我的例子中,似乎decimal.Decimal不工作在这种情况下。有没有一种方法,使其工作,而不转换Decimal为另一种类型?

#!/usr/bin/env python3
import decimal
import pandas
df = pandas.DataFrame({
'foo': list('AABB'),
'bar': list('XYXY'),
'val': [1.4, 6.2, 7, 87.12]})
# create Decimal instead of Float
df.val = df.val.apply(lambda x: round(decimal.Decimal(x), 4))
print(df)
tab = pandas.crosstab(
index=df.foo,
columns=df.bar,
values=df.val,
aggfunc='mean')
print(tab)

输出为

foo bar      val
0   A   X   1.4000
1   A   Y   6.2000
2   B   X   7.0000
3   B   Y  87.1200
Empty DataFrame
Columns: []
Index: [A, B]

我还是不明白这是不是一个bug。

但解决方案是使用python自己的statistics.mean(),它可以处理Decimal。参见aggfunc参数的修改。
import statistics
# ...
tab = pandas.crosstab(
index=df.foo,
columns=df.bar,
values=df.val,
aggfunc=statistics.mean)

最新更新