我有一个适用于Python 3.7x的Pandas 0.24.2数据框,如下所示。我想根据条件逻辑使用相同的名称drop_duplicates()
。在这里可以找到类似的问题:https://gist.github.com/mraleph/3397008,但就我而言,情况变得更加复杂
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Id': [1, 2, 3, 4, 5, 6 ],
'Name': ['A', 'B', 'C', 'A', 'B', 'C' ],
'Value1':[1, np.NaN, 0, np.NaN, 1, np.NaN],
'Value2':[np.NaN, 0, np.NaN, 1, np.NaN, 0 ],
'Value3':[np.NaN, 0, np.NaN, 1, np.NaN, np.NaN]
})
怎么可能:
删除相同“名称”记录的重复项,保留NaN较少的记录吗?
如果它们具有相同数量的NaN,将没有NaN的NaN保留在“ Value1”中?
所需的输出将是:
Id Name Value1 Value2 Value3
2 2 B NaN 0 0
3 3 C 0 NaN NaN
4 4 A NaN 1 1
答案 0 :(得分:2)
想法是为这两个条件创建帮助列,以对重复项进行排序并删除重复项:
df1 = df.assign(count= df.isna().sum(axis=1),
count_val1 = df['Value1'].isna().view('i1'))
df2 = (df1.sort_values(['count', 'count_val1'])[df.columns]
.drop_duplicates('Name')
.sort_index())
print (df2)
Id Name Value1 Value2 Value3
1 2 B NaN 0.0 0.0
2 3 C 0.0 NaN NaN
3 4 A NaN 1.0 1.0