Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-删除与其他行类似的行_Python_Pandas - Fatal编程技术网

Python 熊猫-删除与其他行类似的行

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值的行

我需要从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值的行


如何使用熊猫执行此操作?谢谢大家!

您可以通过使用
删除重复项来实现

初始
数据帧

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 of
NaN
s行中的相同值,则不会将其计为重复,因为
NaN
不等于任何数字。如此优雅,如此简单!谢谢:)请您解释一下,如果不只是在C列中存在NaN值,会发生什么情况?当您使用drop_duplicates时,请选择要考虑的列。因此,在我们的例子中,如果在a、b或d列中的重复行中有
NaN
而不是自由
NaN
s行中的相同值,则不会将其计为重复,因为
NaN
不等于任何数字。