Python 熊猫-删除与其他行类似的行
我需要从pandas.DataFrame中删除所有行,这满足一个不寻常的条件 如果有一个完全相同的行,除了在列“C”中有Nan值外,我想删除这一行 给出一张表格:Python 熊猫-删除与其他行类似的行,python,pandas,Python,Pandas,我需要从pandas.DataFrame中删除所有行,这满足一个不寻常的条件 如果有一个完全相同的行,除了在列“C”中有Nan值外,我想删除这一行 给出一张表格: A B C D 1 2 NaN 3 1 2 50 3 10 20 NaN 30 5 6 7 8 我需要删除第一行,因为它在C列中有Nan,但在C列中有绝对相同的行(第二行)和实值 但是,第三行必须保留,因为没有与它具有相同A、B和D值的行
A B C D
1 2 NaN 3
1 2 50 3
10 20 NaN 30
5 6 7 8
我需要删除第一行,因为它在C列中有Nan,但在C列中有绝对相同的行(第二行)和实值
但是,第三行必须保留,因为没有与它具有相同A、B和D值的行
如何使用熊猫执行此操作?谢谢大家! 您可以通过使用
删除重复项来实现
初始数据帧
:
df=pd.DataFrame(columns=['a','b','c','d'], data=[[1,2,None,3],[1,2,50,3],[10,20,None,30],[5,6,7,8]])
df
a b c d
0 1 2 NaN 3
1 1 2 50 3
2 10 20 NaN 30
3 5 6 7 8
然后可以按列C
对数据帧进行排序。这将把NaN
s放到列的底部:
df = df.sort_values(['c'])
df
a b c d
3 5 6 7 8
1 1 2 50 3
0 1 2 NaN 3
2 10 20 NaN 30
然后删除重复项选择考虑因素列忽略C
并保留第一个捕获行:
df1 = df.drop_duplicates(['a','b','d'], keep='first')
a b c d
3 5 6 7 8
1 1 2 50 3
2 10 20 NaN 30
但只有当NaN
s位于C
列中时,它才有效,您可以使用删除重复项
初始数据帧
:
df=pd.DataFrame(columns=['a','b','c','d'], data=[[1,2,None,3],[1,2,50,3],[10,20,None,30],[5,6,7,8]])
df
a b c d
0 1 2 NaN 3
1 1 2 50 3
2 10 20 NaN 30
3 5 6 7 8
然后可以按列C
对数据帧进行排序。这将把NaN
s放到列的底部:
df = df.sort_values(['c'])
df
a b c d
3 5 6 7 8
1 1 2 50 3
0 1 2 NaN 3
2 10 20 NaN 30
然后删除重复项选择考虑因素列忽略C
并保留第一个捕获行:
df1 = df.drop_duplicates(['a','b','d'], keep='first')
a b c d
3 5 6 7 8
1 1 2 50 3
2 10 20 NaN 30
但只有当NaN
s在C
列中时,它才有效。您可以尝试将fillna与drop\u副本一起使用
df.bfill().ffill().drop_duplicates(subset=['A', 'B', 'D'], keep = 'last')
这将处理这样的情况,例如A、B和D值相同,但C在两行中都有非NaN值。
你得到
您可以尝试使用fillna和drop_副本
df.bfill().ffill().drop_duplicates(subset=['A', 'B', 'D'], keep = 'last')
这将处理这样的情况,例如A、B和D值相同,但C在两行中都有非NaN值。
你得到
我觉得这是对的
notdups = ~df.duplicated(df.columns.difference(['C']), keep=False)
notnans = df.C.notnull()
df[notdups | notnans]
A B C D
1 1 2 50.0 3
2 10 20 NaN 30
3 5 6 7.0 8
我觉得这是对的
notdups = ~df.duplicated(df.columns.difference(['C']), keep=False)
notnans = df.C.notnull()
df[notdups | notnans]
A B C D
1 1 2 50.0 3
2 10 20 NaN 30
3 5 6 7.0 8
在这种情况下,df.bfill()将填充所有的NaN
s是的,但是假设所有的NaN都在实际数据集中的真实值之后是有缺陷的,这是一个非常有力的假设。起初,行可能是随机排列的。好吧,我认为如果没有这样的任务来填充NaN
s,那么我们就不应该这样做=),否则可能会在进一步的分析中产生问题。在这种情况下,所有更改都是可见的,但是如果您有数百万行?人为值会使数据更脏。在这种情况下,df.bfill()将填充所有的NaN
s是的,但是假设所有的NaN都在实际数据集中的真实值之后是有缺陷的,这是一个非常强的假设。起初,行可能是随机排列的。好吧,我认为如果没有这样的任务来填充NaN
s,那么我们就不应该这样做=),否则可能会在进一步的分析中产生问题。在这种情况下,所有更改都是可见的,但是如果您有数百万行?人工值会让数据变得更脏。如此优雅,如此简单!谢谢:)请您解释一下,如果不只是在C列中存在NaN值,会发生什么情况?当您使用drop_duplicates时,请选择要考虑的列。因此,在我们的例子中,如果在a、b或d列中的重复行中有NaN
而不是在free ofNaN
s行中的相同值,则不会将其计为重复,因为NaN
不等于任何数字。如此优雅,如此简单!谢谢:)请您解释一下,如果不只是在C列中存在NaN值,会发生什么情况?当您使用drop_duplicates时,请选择要考虑的列。因此,在我们的例子中,如果在a、b或d列中的重复行中有NaN
而不是自由NaN
s行中的相同值,则不会将其计为重复,因为NaN
不等于任何数字。