Python: 用NaN值过滤CSV

问题描述 投票:0回答:1

我有一个类似于这样的csv,名为'output_data.csv'。

date         product       conditional      client       time       termination_date
18/04/2020   Test 1        TRUE             Test 1       10         NaN
19/04/2020   Test 1        TRUE             Test 1       10         NaN
20/04/2020   Test 1        TRUE             Test 1       10         NaN
21/04/2020   Test 1        TRUE             Test 1       10         NaN
22/05/2020   Test 1        TRUE             Test 1       10         NaN
23/05/2020   Test 1        TRUE             Test 1       10         NaN
24/05/2020   Test 1        TRUE             Test 1       10         NaN
18/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
19/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
20/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
21/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
22/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
23/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
24/05/2020   Test 1        TRUE             Test 2       10         19/05/2020

我想在我的代码中写一行简单的代码 来过滤掉任何有终止日期的行。

所以输出的结果会是这样的。

date         product       conditional      client       time       termination_date
19/05/2020   Test 1        TRUE             Test 1       10         
19/05/2020   Test 1        TRUE             Test 1       10         
20/05/2020   Test 1        TRUE             Test 1       10         
21/05/2020   Test 1        TRUE             Test 1       10         
22/05/2020   Test 1        TRUE             Test 1       10         
23/05/2020   Test 1        TRUE             Test 1       10         
24/05/2020   Test 1        TRUE             Test 1       10         
18/05/2020   Test 1        TRUE             Test 2       10         19/05/2020
19/05/2020   Test 1        TRUE             Test 2       10         19/05/2020

我曾经成功地使用过下面的代码 但这次我得到的是一个空白的csv文件。

output_data = output_data.loc[output_data['termination_date'] > output_data['date']]

我相信这可能是因为NaN值的原因,但我不确定。

有谁知道我可以对这行代码进行哪些修改,以忽略这些值并提供我提到的输出?

非常感谢

===编辑====

对不起,伙计们,看起来过滤器没有问题,但是在这段代码之前,我用下面的脚本把所有的 termination_date 都变成了 NaN。

    output['termination_date'] = pd.to_datetime(output_data['termination_date'], errors='coerce', format='%d/%m/%Y')

这是把终止日期变成时间戳的尝试,我可以用它来过滤,但是 errors='coerce'把所有的值都变成了NaN,因为没有它,我得到了下面的错误。

ValueError: time data '2019-07-30 00:00:00+00' does not match format '%d/%m/%Y' (match)

这是因为原来的终止日期的格式是 "yyy-mm-dd hh:mm:ss+00" 所以我想把它变成和我的脚本一样的格式: "ddmmyyyy".

所以我想现在的问题是,我怎样才能把原始日期变成 ddmmyyyy,而不需要传递 errors='coerce' ?

python python-3.x pandas filter nan
1个回答
2
投票

我想是你的不等式的方向有问题。应该是这样的。

output_data = output_data.loc[output_data['termination_date'] < output_data['date']]

此外,如果你想保留Nan的值,你可以用... ..:

output_data = output_data.loc[(output_data['termination_date'] < output_data['date']) | (output_data['termination_date'].isna())]

可以用:"编辑

根据你文章的编辑部分,你正在将列转换为datetime类型,但是你使用了斜线而不是数据样本中的连字符。你应该在你的函数中修改这一点。你也可以去掉 逼迫 属性或将其改为 漠视:

output['termination_date'] = pd.to_datetime(output_data['termination_date'], errors='ignore', format='%d-%m-%Y')

1
投票

你需要这样做。

df['termination_date'] = pd.to_datetime(df['termination_date'])
df['date'] = pd.to_datetime(df['date'])
df = df[df['termination_date'] > df['date']]

输出:

        date product  conditional  client  time termination_date
7 2020-05-18  Test 1         True  Test 2    10       2020-05-19

而<给出了这个输出。

df = df[df['termination_date'] < df['date']]

输出:

         date product  conditional  client  time termination_date
9  2020-05-20  Test 1         True  Test 2    10       2020-05-19
10 2020-05-21  Test 1         True  Test 2    10       2020-05-19
11 2020-05-22  Test 1         True  Test 2    10       2020-05-19
12 2020-05-23  Test 1         True  Test 2    10       2020-05-19
13 2020-05-24  Test 1         True  Test 2    10       2020-05-19
© www.soinside.com 2019 - 2024. All rights reserved.