gpt4 book ai didi

python - 当组列中的 NaN 时,Pandas groupby 会应用奇怪的行为

转载 作者:行者123 更新时间:2023-12-04 13:35:53 24 4
gpt4 key购买 nike

我遇到了一些意外的 Pandas groupby-apply 结果,我无法找出确切原因。

下面我必须使用相同的数据帧,除了 2 个值的排序。 df1 产生我期望的结果,但 df2 产生完全不同的结果。

import numpy as np

df1 = pd.DataFrame({'group_col': [0.0, np.nan, 0.0, 0.0], 'value_col': [2,2,2,2]})
df2 = pd.DataFrame({'group_col': [np.nan, 0.0, 0.0, 0.0], 'value_col': [2,2,2,2]})

df1:
   group_col  value_col
0 0.0 2
1 NaN 2
2 0.0 2
3 0.0 2

df2:
   group_col  value_col
0 NaN 2
1 0.0 2
2 0.0 2
3 0.0 2

当我通过 group_col 分组时并计算 value_col 的 value_counts每个组,包括重新索引以在结果中包含所有可能的值我得到以下 df1:
df1.groupby('group_col').value_col.apply(lambda x: x.value_counts().reindex(index=[1,2,3]))

group_col
0.0 1 NaN
2 3.0
3 NaN
Name: value_col, dtype: float64


它正确地找到 1 个组并返回一个多索引系列,每个可能的值都有 value_counts。但是当我在 df2 上运行相同的程序时,我得到了完全不同的结果:
0    NaN
1 NaN
2 3.0
3 NaN
Name: value_col, dtype: float64

这里的结果包含一个与原始 DataFrame 匹配的索引,而不是我期望的多索引。我认为这可能与以 np.nan 开头的 group 列有关,但后来我尝试删除最后一行,并再次得到预期的结果,因此显然原因是其他原因。
df2.head(3).groupby('group_col').value_col.apply(lambda x: x.value_counts().reindex(index=[1,2,3]))

group_col
0.0 1 NaN
2 2.0
3 NaN
Name: value_col, dtype: float64


什么可能导致这种情况?

最佳答案

让我们从一些简单的分组计算开始,以了解 Pandas 是如何工作的。

在以下情况下,分组键用作结果 Series 中的索引目的。原始索引被删除。

In [4]: df1.groupby('group_col')['value_col'] \
...: .apply(lambda x: {'sum': x.sum(), 'mean': x.mean()})
Out[4]:
group_col
0.0 sum 6.0
mean 2.0
Name: value_col, dtype: float64

In [5]: df2.groupby('group_col')['value_col'] \
...: .apply(lambda x: {'sum': x.sum(), 'mean': x.mean()})
Out[5]:
group_col
0.0 sum 6.0
mean 2.0
Name: value_col, dtype: float64

在下一种情况下,原始索引 DataFrame被保留下来。结果中不包含分组键 Series .
In [6]: df1.groupby('group_col')['value_col'].apply(lambda x: x / len(x))
Out[6]:
0 0.666667
1 NaN
2 0.666667
3 0.666667
Name: value_col, dtype: float64

In [7]: df2.groupby('group_col')['value_col'].apply(lambda x: x / len(x))
Out[7]:
0 NaN
1 0.666667
2 0.666667
3 0.666667
Name: value_col, dtype: float64

是什么让 pandas 在生成组合对象的索引时表现不同?

实际上,这是基于 索引是否被聚合改变 .当原始对象和结果对象的索引相同时,它选择重用原始索引。另一方面,当索引与原始对象不同时,它会使用索引中的组键来形成 MultiIndex .

现在,回到问题,请注意索引已更改为 df1 .对于组 key 0.0 ,原始chunk的索引为 [0, 2, 3] , 而它是 [1, 2, 3]聚合后。但是,对于 df2 ,原索引为 [1, 2, 3] ,并且意外地,它没有被聚合改变。

关于python - 当组列中的 NaN 时,Pandas groupby 会应用奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62092199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com