【发布时间】:2022-08-15 09:21:48
【问题描述】:
根据多个条件删除重复项 根据多个条件删除重复项
根据多个条件删除重复项 根据多个条件删除重复项
识别缺失的名称并打印 ID:
print(f"Missing names: {', '.join(df.loc[df['name'].isna(), 'ID'].astype(str))}")
# Missing names: 379, 579
fillna 名称,然后获取每组的第一个非 NA(或第一个 NA,如果没有):
df2 = df.assign(name=df['name'].fillna('ID/'+df['ID'].astype(str)))
df2 = df2.loc[df2['verified'].notna().groupby(df['ID'], sort=False).idxmax()]
print(df2)
输出:
name ID verified
0 joe 123 213.0
3 mary 342 643.0
5 sam 214 NaN
7 jack 992 NaN
8 ID/379 379 NaN
9 ID/579 579 NaN
【讨论】:
根据所有或选定的列在数据框中查找重复行。
# Selecting duplicate rows except first
# occurrence based on all columns
duplicate = df[df.duplicated(keep = 'first')]
【讨论】:
这是我尽力回答您的问题的尝试。这个想法是结合单独的数据框来得出所需的答案。
# Generate Data
data_dict = {
'name': ['joe', 'sally', 'sarah', 'mary', 'adam', 'sam', 'jill', 'jack', np.nan, np.nan],
'ID': [123, 123, 342, 342, 342, 214, 214, 992, 379, 579],
'verified': [213, np.nan, np.nan, 643, 932, np.nan, np.nan, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data_dict)
# First Part of the Answer
for idx, row in df.iterrows():
if isinstance(row['name'], float):
row = row.copy()
df.at[idx, 'name'] = row['ID']
# Second Part of the Answer
a = df.dropna().drop_duplicates(subset=['ID'])
id_a = a['ID'].unique()
b = df[df['verified'].isna()].drop_duplicates(subset=['ID'])
c = b[b['ID'].apply(lambda x: x not in id_a)]
pd.concat([a,c])
答案的第一部分地址“如果他们没有名称值,只需将 NaN 替换为 ID 值。”并且答案的第二部分解决了“我想取那些重复项中的任何一个在“已验证”列中具有值。如果该列中有多行具有值,则只需取具有已验证值的第一行. 如果所有重复项都没有经过验证的行,则只保留第一个重复项。重要的是所有行都有一个名称值。
【讨论】:
您可以使用sort_values 和key = lambda x: x != '' 来根据verified 列是否有值对行进行排序。然后将参数keep = 'first' 赋予df.duplicated 将保留具有非空值的行(如果存在)。
【讨论】: