gpt4 book ai didi

python - pandas - 筛选在 groupby 中至少有一列包含非空值的组

转载 作者:行者123 更新时间:2023-12-01 08:42:37 24 4
gpt4 key购买 nike

我有以下 python pandas 数据框:

df = pd.DataFrame({'Id': ['1', '1', '1', '2', '2', '3'], 'A': ['TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'FALSE'], 'B': [np.nan, np.nan, 'abc', np.nan, np.nan, 'def'],'C': [np.nan, np.nan, np.nan, np.nan, np.nan, '456']})

>>> print(df)
Id A B C
0 1 TRUE NaN NaN
1 1 TRUE NaN NaN
2 1 TRUE abc NaN
3 2 TRUE NaN NaN
4 2 TRUE NaN NaN
5 3 FALSE def 456

我想最终得到以下数据框:

>>> print(dfout)
Id A B C
0 1 TRUE abc NaN

相同的 Id 值可以出现在多行中。每个 Id 在 A 列中的所有行上都将具有一致的值 TRUE 或 FALSE。 B 列和 C 列可以具有任何值,包括 NaN。
我希望 dfout 中每个具有 A=TRUE 的 Id 都有一行,并显示 B 列和 C 列中看到的最大值。但是,如果 Id 的所有行中 B 列和 C 列中看到的唯一值 = NaN,则该 Id 是从 dfout 中排除。

  • Id 1 具有 A=TRUE,并且其第三行具有 B=abc,因此满足要求。
  • Id 2 具有 A=TRUE,但 B 列和 C 列为 NaN都是它的行,所以它没有。
  • Id 3 具有 A=FALSE,因此它不满足要求。

我在 Id 上创建了一个 groupby df,然后应用了一个掩码以仅包含 A=TRUE 的行。但无法理解如何删除 B 列和 C 列中所有行的 NaN 行。

grouped = df.groupby(['Id'])
mask = grouped['A'].transform(lambda x: 'TRUE' == x.max()).astype(bool)
df.loc[mask].reset_index(drop=True)

Id A B C
0 1 TRUE NaN NaN
1 1 TRUE NaN NaN
2 1 TRUE abc NaN
3 2 TRUE NaN NaN
4 2 TRUE NaN NaN

然后我尝试了以下几件事:

df.loc[mask].reset_index(drop=True).all(['B'],['C']).isnull

但是出现错误,例如:

" TypeError: unhashable type: 'list' ".

使用python 3.6,pandas 0.23.0;在这里寻求帮助:keep dataframe rows meeting a condition into each group of the same dataframe grouped by

最佳答案

该解决方案分为三个部分。

  1. 过滤数据帧以保留 A 列为 True 的行

  2. Groupby Id 并首先使用,这将返回第一个非空值

  3. 对 B 列和 C 列的结果数据帧使用 dropna,其中 how = 'all'

    df.loc[df['A'] == True].groupby('Id', as_index = False).first().dropna(subset = ['B', 'C'], how = '全部')

        Id  A       B   C
    0 1 True abc NaN

关于python - pandas - 筛选在 groupby 中至少有一列包含非空值的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437636/

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