我有一个看起来像这样的 pandas 数据框:
header1 | header2 | header3 |
---|---|---|
val1 | 1 | True |
val2 | 2 | True |
val1 | 1 | True |
val2 | 2 | False |
我想根据最后一列是否为 True
有条件地对行进行重复数据删除。
在上面的 table 中,我希望 drop 后的输出数据帧如下所示:
header1 | header2 | header3 |
---|---|---|
val1 | 1 | True |
val2 | 2 | True |
val2 | 2 | False |
对第三行进行了重复数据删除,因为它的标题 3 设置为 true,但没有第四行,因为它的标题 3 设置为 false。
我还没有弄清楚如何做到这一点,因为 drop_duplicates
不明确支持这一点,并且遍历整个数据框通常不是一个好习惯(尽管如果必须的话我会这样做)。
回答1
假设如果标题为 False,您想保留所有重复的行,这应该有效
# flag the row if header3 is not False or duplicated
df = df[~df['header3'] | ~df.drop(columns='header3').duplicated()]
print(df)
header1 header2 header3
0 val1 1 True
1 val2 2 True
3 val2 2 False
回答2
将 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html 与 https://pandas.pydata.org/docs/reference/api/pandas.concat.html 一起使用:
In [606]: ix = df[df['header3']].drop_duplicates().index
In [610]: df = pd.concat([df.loc[ix], df[~df['header3']]])
In [611]: df
Out[611]:
header1 header2 header3
0 val1 1 True
1 val2 2 True
3 val2 2 False