分组重复项,使NaN等于任何值

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

我想基于多个列聚合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()一样,但是如果您知道一种仅将行标记为重复的解决方案,则返回DataFrame.duplicated这样的布尔数列,那么我就可以找到解决方法。 >

特别是对于我的问题,将有任意多的列,但只有1列缺少值。您可以假定存在唯一的填充值来填充该列中的缺失值,以避免这些行被丢弃在groupby中。

我想基于多个列聚合DataFrame中的重复行,但是对“重复”的含义进行了非常规定义。想象一个具有两列A和B的DataFrame:在[45]中:df ...

python-3.x pandas dataframe duplicates pandas-groupby
1个回答
1
投票

一种方法可能是,如果组中的groupby为1(不计入nan),则将所有其他列(此处仅B)和transform替换为False,否则使用nunique。然后,您可以使用此掩码或True保留所需的行:

notna
© www.soinside.com 2019 - 2024. All rights reserved.