我想基于多个列聚合DataFrame中的重复行,但是对“重复”的含义进行了非常规定义。
想象一下DataFrame
有两列,A
和B
:
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个唯一值(不计算缺失值)。
这对最后三行造成了问题,因为缺少的值可能会填入0
或1
。在这种情况下,我不希望将行汇总在一起;第2和3行都不应重复,第3和4行也不应重复。即使第2、3和4行在B
列中共享相同的值,但它们都不是另一个的重复项,因为在A
列中有2个唯一值(不计算缺失值)。
[最终目标是将重复的行汇总在一起,就像DataFrame.groupby().aggregate()
一样,但是如果您知道一种仅将行标记为重复的解决方案,则返回DataFrame.duplicated
这样的布尔数列,那么我就可以找到解决方法。 >
特别是对于我的问题,将有任意多的列,但只有1列缺少值。您可以假定存在唯一的填充值来填充该列中的缺失值,以避免这些行被丢弃在groupby
中。
我想基于多个列聚合DataFrame中的重复行,但是对“重复”的含义进行了非常规定义。想象一个具有两列A和B的DataFrame:在[45]中:df ...
一种方法可能是,如果组中的groupby
为1(不计入nan),则将所有其他列(此处仅B)和transform
替换为False
,否则使用nunique
。然后,您可以使用此掩码或True
保留所需的行:
notna