gpt4 book ai didi

python - pandas groupby 中的 NaN 项目是否紧随其后,包括类别列预期行为?

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:35 27 4
gpt4 key购买 nike

我聚合了一个包含类别列的 pandas DataFrame。输出包含几个我没有预料到且不理解的 NaN。示例代码:

import pandas as pd

d = pd.DataFrame({'a': [1, 1, 2, 2], 'b': [1, 1, 2, 2], 'c': [1, 2, 3, 4]})
d.astype({'b': 'category'}).groupby('a').agg({'b':'first', 'c':['mean', 'max']})

我得到以下输出:

      b    c     
first mean max
0 1 NaN NaN
1 2 1.5 2.0
2 NaN 3.5 4.0

我期望得到以下输出:

      b    c    
first mean max
a
1 1 1.5 2
2 2 3.5 4

有人可以解释 NaN 吗?

以下两个代码变体,一个没有类别列,一个没有 c 列的多个聚合,给出了预期的输出。

d.groupby('a').agg({'b':'first', 'c':['mean', 'max']})
d.astype({'b': 'category'}).groupby('a').agg({'b':'first', 'c':'mean'})

我使用的是 pandas 0.25.2 和 python 3.7.4。

最佳答案

我的解释的出发点是有(和比较的行为)两个数据框:

  • d - 原始 DataFrame,
  • d2 = d.astype({'b': 'category'}) - sibling DataFrame,b 列更改为 分类

创建这两个 DataFrame 的分组:

gr = d.groupby('a')
gr2 = d2.groupby('a')

目前它们看起来完全相同,例如如果你运行:

for key, grp in gr:
print(f'\nGroup: {key}\n{grp}')

gr2 的相同代码,您将得到完全相同的结果。

但是当你尝试时,结果会变得不同聚合 b 列。

当您运行 gr.b.agg('first')(在原始 DataFrame 上)时,您将获得:

a
1 1
2 2
Name: b, dtype: int64

结果是一个系列,正如d 内容所预期的那样:

  • 对于 a == 1 的行组,b 的第一个值为 1
  • 对于 a == 2 的行组,b 的第一个值为 2

但是如果你运行 gr2.b.agg('first')(在兄弟 DataFrame 上),你会得到:

[1, 2]
Categories (2, int64): [1, 2]

结果是 pandas.core.arrays.categorical.Categorical 类型更重要的是,与分组键没有关系

相反,类似分组键的东西是连续数字(从 0 开始)。

您可以确认这一点,运行 gr2.agg({'b':'first'})你会得到:

   b
0 1
1 2

这正是您问题的根源。当你运行时:

gr2.agg({'b':'first', 'c':['mean', 'max']})

加入两者分类和“正常”列的聚合,然后:

  • 上述人工分组键来自b 的聚合,
  • 与来自 c 聚合的实际 分组键结合。

对于(人工)分组键0:

  • b/first 的值为 1(见上文),
  • c/meanc/max 没有值,所以结果包含 2 个 NaN

对于分组键1:

  • 对于人工键,b/first的值为2
  • 对于 true 键,c/meanc/max 的值是1.52.0
  • 但是 Pandas 将它们全部放在同一行中。

对于分组键2:

  • 没有具有此值的“人工”分组键,所以在 b/first 列中有 NaN,
  • c/meanc/max对应的值,所以它们被打印在那里。

结论:在这种情况下,转换不是一个好主意任何列到分类类型。

仅使用原始 DataFrame,具有“原始”(非分类)类型您将获得预期的结果。

截至 09:14:38Z 编辑以下评论

你的帖子和你的帖子有矛盾提到的评论。

您的帖子包含写:

I get the following output:

b c
first mean max
0 1 NaN NaN
1 2 1.5 2.0
2 NaN 3.5 4.0

因此打印输出确实包含NaN值。

但是在你写的评论中我没有得到任何 NaN

为了验证这个矛盾,我又做了一次测试:

d = pd.DataFrame({'a': [1, 1, 2, 2], 'b': [1, 1, 2, 2], 'c': [1, 2, 3, 4]})
d2 = d.astype({'b': 'category'})
d2.groupby('a').agg({'b':'first', 'c':['mean', 'max']})

得到:

      b    c     
first mean max
0 1 NaN NaN
1 2 1.5 2.0
2 NaN 3.5 4.0

就像在您的帖子中一样 NaN 值。

关于python - pandas groupby 中的 NaN 项目是否紧随其后,包括类别列预期行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659946/

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