【问题标题】:Python: Filtering CSV with NaN valuesPython:使用 NaN 值过滤 CSV
【发布时间】:2020-09-04 18:02:50
【问题描述】:

我有一个看起来像这样的 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 值,但我不确定。

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

提前非常感谢!

===编辑===

抱歉,看起来过滤器很好,但在这段代码之前,我使用以下脚本将所有终止日期转换为 NaN:

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

这是尝试将 terminate_date 设置为可用于过滤的时间戳,但 errors='coerce' 会将所有值转换为 NaN,因为没有它我会收到以下错误:

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

这是因为原始终止日期的格式为“yyyy-mm-dd hh:mm:ss+00”,所以我试图将其转换为与脚本其余部分相同的格式:“dd/mm/年年”。

所以我想现在的问题是,我怎样才能将原始日期转换为 dd/mm/yyyy,而不必传递 errors='coerce' ?

【问题讨论】:

    标签: python python-3.x pandas filter nan


    【解决方案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
    

    【讨论】:

    • 感谢您的回答!这仍然给我一个空白的 csv 输出。是否与某些 terminate_date 值为空白无关?
    • 空白 CSV 输出是什么意思?您如何转换为 CSV?
    • 您正在将 CSV 转换为 DataFrame,删除行并添加回 CSV 对吗?
    • 保存CSV不会有问题,因为DataFrame也是空的。我真的很抱歉,在查看我的其余代码时,我意识到问题来自其他地方。我已经用剩下的问题编辑了原始帖子,你能看一下吗? :)
    • 不需要强制,可以使用errors='ignore'。它只会忽略错误而不将它们转换为 NaT
    【解决方案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())]
    

    编辑:

    根据您帖子的编辑部分,您正在将该列转换为日期时间类型,但您使用的是斜杠而不是数据示例中显示的连字符。你应该在你的函数中修改它。你也可以去掉 coerce 属性或者改成'ignore':

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

    【讨论】:

    • 感谢您的回复!第一个代码仍然给我一个空白的 csv 输出,第二个给我所有没有任何过滤的输出......还有什么我应该尝试的吗?
    • @MTavares 很难说。我想它与 Nan 值无关。您能否向我们提供更多您正在执行的代码?
    • 非常抱歉,在查看我的其余代码时,我意识到问题出在其他地方。我已经用剩下的问题编辑了原始帖子,你能看一下吗? :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2017-06-05
    • 2014-05-18
    • 2019-08-07
    相关资源
    最近更新 更多