在熊猫的groupby上使用lambda函数时的奇怪行为

时间:2018-09-27 06:59:58

标签: python-3.x pandas

我有一只熊猫DataFrame,有两组'A''B',每组中都缺少一个元素。

df4 = pd.DataFrame({'Name' : ['A', 'A', 'A', 'A', 'B', 'B', 'B'], 
                    'X' : [0, 0.5,1, np.nan, 1,np.nan,1]})

Name    X
A       0.0
A       0.5
A       1.0
A       nan
B       1.0
B       nan
B       1.0

我想使用lambda函数为每个组填写缺少的数据

使用x.mean()时的正确行为

df4.groupby('Name')['X'].transform(lambda x: x.fillna(x.mean()))
0    0.0
1    0.5
2    1.0
3    0.5 <------ Filled as 0.5
4    1.0
5    1.0 <------ Filled as 1
6    1.0

如果我如上所述使用x.mean(),则此行为是正确的,因为在A组中,平均值为1.5/3,即0.5。 B组也是如此。

使用x.std()时的奇怪行为

但是,如果我改用x.std(),则填写的数字对我来说没有意义。对于组A,只有三个现有元素00.51.0,其标准偏差应为0.408。但是,lambda函数为我提供了以下输出。

df4.groupby('Name')['X'].transform(lambda x: x.fillna(x.std()))
0    0.0
1    0.5
2    1.0
3    0.5 <------ Filled as 0.5 instead of 0.4082
4    1.0
5    0.0 <------ Correct
6    1.0 

有人可以解释这种行为吗? 0.5从哪里来?

1 个答案:

答案 0 :(得分:3)

需要将pandas.Series.std #include <iostream> #include <variant> struct Visitor{ void operator()(double){ std::cout << "Double!" << std::endl; }; void operator()(int){ std::cout << "Int!" << std::endl; }; // that was missing: void operator()(std::monostate){ std::cout << "Mono!" << std::endl; }; }; int main() { std::variant<std::monostate, int, double> v = 1; std::variant<std::monostate, int, double> w; std::visit(Visitor{}, v); std::visit(Visitor{}, w); } 的默认参数更改为ddof=1

ddof=0