我有一个看起来像这样的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),但我不明白如何做(3)
>>> 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
答案 0 :(得分:1)
对于按列指定的每个组的替换值,可以使用具有向前和向后填充None
或NaN
值的自定义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