gpt4 book ai didi

python-3.x - 分组重复项,允许 NaN 等于任何值

转载 作者:行者123 更新时间:2023-12-05 05:05:00 25 4
gpt4 key购买 nike

我想根据多列聚合 DataFrame 中的重复行,但对“重复”的含义有非常规的定义。

想象一个 DataFrame有两列,AB :


In [45]: df = pd.DataFrame([[0, 0], [pd.NA, 0], [0, 1], [pd.NA, 1], [1, 1]], columns=['A', 'B']).convert_dtypes()

In [63]: df
Out[63]:
A B
0 0 0
1 <NA> 0
2 0 1
3 <NA> 1
4 1 1

基本上,应该允许缺失值等于任何值,只要它不需要一次“等于”多个值即可。

因此,第一行和第二行应该被声明为重复的,并且聚合在一起。第 0 行和第 1 行重复,因为它们在 B 列中共享相同的值,并且因为在列 A 中只有 1 个唯一值(不包括缺失值) .

这给最后三行带来了问题,因为缺失值可以填充 01 .在这种情况下,我不希望行聚合在一起;第 2 行和第 3 行不应重复,第 3 行和第 4 行也不应重复。尽管第 2、3 和 4 行在 B 列中共享相同的值,它们都不是另一个的重复项,因为列 A 中有 2 个唯一值(不包括缺失值) .

最终目标是将重复的行聚合在一起,就像 DataFrame.groupby().aggregate() ,但如果您知道将行标记为重复的解决方案,则返回一个 bool 系列,如 DataFrame.duplicated ,然后这让我有些路要走。

特别是对于我的问题,会有任意多列,但只有 1 列有缺失值。您可以假设存在一个唯一的填充值来填充该列中的缺失值,以避免这些行在 groupby 中被删除。 .

最佳答案

一种方法可能是 groupby 所有其他列(这里只有 B)和 transform 如果 nuniqueFalse组中的 code> 为 1(不计算 nan),否则为 True。然后你可以使用这个掩码或 notna 来保留你想要的行:

print (df.loc[ df.groupby('B')['A'].transform(lambda x: False if x.nunique()==1 else True)
|df['A'].notna(), :])
A B
0 0 0
2 0 1
3 <NA> 1
4 1 1

编辑:如果除了 np.nan 之外只有一个值可以通过转换完成并用唯一值替换 nan,则创建组:

df['gr'] = df.groupby('B')['A'].transform(lambda x: x.max() if x.nunique()==1 else x)

然后您可以对 B 和此列 gr 执行一些 groupby,不确定您的预期输出

关于python-3.x - 分组重复项,允许 NaN 等于任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60778190/

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