熊猫-在填充特定行时删除重复项(逐行填充)

时间:2020-05-28 09:09:38

标签: python pandas grouping data-cleaning

我有一个看起来像这样的DataFrame:

>> pd.DataFrame([["Anne", True, 1, "A"],["Bert", True, None, "B"],["Conan", False, 0, None],["Bert", None, None, None],["Conan", None, None, "C"],["Bert",None,2,None]], columns = ["Name", "Bool", "Int", "Char"])

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  NaN     B
2  Conan  False  0.0  None
3   Bert   None  NaN  None
4  Conan   None  NaN     C
5   Bert   None  2.0  None

我想要的是

  1. 基于列删除重复项
  2. 在删除过程中,使行的NaN减少
  3. 如果可能,使用一组行(根据条件)填充Nan值

我可以做(1)和(2),但我不明白如何做(3)

第1部分和第2部分

>>> def remove_duplicates_smartly(df, columns):
        df.assign(nan_count= df.isna().sum(axis=1), inplace=True) 
        df.sort_values(['nan_count'], inplace=True).drop_duplicates(columns, inplace=True)
        df.drop(columns=["nan_count"], inplace=True)
        return df

>>> my_df = pd.DataFrame([["Anne", True, 1, "A"],["Bert", True, None, "B"],["Conan", False, 0, None],["Bert", None, None, None],["Conan", None, None, "C"],["Bert",None,2,None]], columns = ["Name", "Bool", "Int", "Char"])
>>> remove_duplicates_smartly(my_df)

>>> remove_duplicates_smartly(my_df, ["Name"])

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  NaN     B
2  Conan  False  0.0  None

所需的输出

可以使用即将删除的行来填充当前缺失值。新值应从即将被删除的行中获取,这些行具有一个共同的值(由用户选择)(在这种情况下为“名称”)

    Name   Bool  Int  Char
0   Anne   True  1.0     A
1   Bert   True  2.0     B
2  Conan  False  0.0     C

1 个答案:

答案 0 :(得分:1)

对于按列指定的每个组的替换值,可以使用具有向前和向后填充NoneNaN值的自定义lambda函数。

如果使用填充了诸如Name之类的不丢失值的列进行分组,则解决方案可以正常工作。

columns = 'Name'
df = df.groupby(columns).apply(lambda x: x.ffill().bfill()).drop_duplicates(columns)
print (df)
    Name   Bool  Int Char
0   Anne   True  1.0    A
1   Bert   True  2.0    B
2  Conan  False  0.0    C