在 Pandas 中的多列上使用 groupby 和条件 lambda 变换时出现问题

问题描述 投票:0回答:1

我对使用 Pandas 时出现的奇怪行为感到好奇。

我最初的目的是,对于数据中的每个组,当该列包含超过 x% 的缺失值时,用 NA 替换该列中的所有值,否则保留原始值,包括 NA。

为此,我尝试使用

groupby
transform
以及包含
x.isna().mean()
上的条件语句的 lambda。它在大多数情况下都有效,但当满足某些特定条件时会给出奇怪的结果。

这是一个带有玩具数据框的可重现示例;阈值设置为 60% 缺失值 :

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
    "A" : [np.nan, 4.7, 6.6, np.nan, np.nan, 5.4, 6., 5.3],
    "B" : [np.nan, np.nan, 7.2, 15., np.nan, 5.5, np.nan, np.nan],
    "C" : ["D", "D", "D", "E", "E", "F", "F", "F"]
    }
 )

df.groupby("C").transform(lambda x : x if x.isna().mean() < .6 else np.nan)

初始数据:

     A     B  C
0  NaN   NaN  D
1  4.7   NaN  D
2  6.6   7.2  D
3  NaN  15.0  E
4  NaN   NaN  E
5  5.4   5.5  F
6  6.0   3.1  F
7  5.3   NaN  F

我的期望:

     A     B
0  NaN   NaN
1  4.7   NaN
2  6.6   NaN
3  NaN  15.0
4  NaN   NaN
5  5.4   5.5
6  6.0   3.1
7  5.3   NaN

我得到了什么:

     A                                       B
0  NaN                                     NaN
1  4.7                                     NaN
2  6.6                                     NaN
3  NaN    3 15.0 4 NaN Name: B, dtype: float64
4  NaN    3 15.0 4 NaN Name: B, dtype: float64
5  5.4                                     5.5
6  6.0                                     3.1
7  5.3                                     NaN

我的问题在于第 3 行和第 4 行,其中返回的是整个系列而不是原子值。

经过几次测试,似乎只有满足两个条件才会发生:

  1. 列中的分组值设置为NaN;
  2. 第二个列中的值应该保持不变。
如果我在我的情况下切换到

x.notna()

,当A列仅包含有效值时会发生同样的问题,并且错误总是出现在以下列中。

我知道还有其他方法可以在 Pandas 中获得想要的结果,所以请随意提出建议,但我真的很想了解这里发生的情况:我的代码在某种程度上是否有错误,可以轻松纠正吗?什么样的错误?

感谢您的帮助,如果我的英语有点笨拙,请抱歉:)

python pandas group-by
1个回答
0
投票
用途:

m = df.groupby("C").transform(lambda x : x.isna().mean()) < .6 #alternative m = df.isna().groupby(df["C"]).transform('mean') < .6 df[m.columns] = df[m.columns].where(m) print (df) A B C 0 NaN NaN D 1 4.7 NaN D 2 6.6 NaN D 3 NaN 15.0 E 4 NaN NaN E 5 5.4 NaN F 6 6.0 NaN F 7 5.3 NaN F
    
© www.soinside.com 2019 - 2024. All rights reserved.