我想用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)