Python:使用 NaN 值过滤 CSV
Python: Filtering CSV with NaN values
我有一个看起来像这样的 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
我正在尝试在我的代码中写一行简单的代码来过滤掉任何 termination_date < date.
的行
所以输出看起来像这样:
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')
这是试图将 termination_date 变成我可以用来过滤的时间戳,但是 errors='coerce' 将所有值都变成了 NaN,因为没有它我会得到以下错误:
ValueError: time data '2019-07-30 00:00:00+00' does not match format '%d/%m/%Y' (match)
这是因为原始 termination_date 的格式为 "yyyy-mm-dd hh:mm:ss+00",所以我试图将其转换为与脚本其余部分相同的格式:"dd/mm/yyyy".
所以我想现在的问题是,如何将原始日期变成 dd/mm/yyyy,而不必传递错误='coerce'?
您需要这样做:
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
我觉得你的不平等的方向是这样的。应该是:
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())]
编辑:
根据您 post 的编辑部分,您正在将列转换为日期时间类型,但您使用的是斜线而不是数据样本中显示的连字符。你应该在你的函数中修改它。您还可以摆脱 coerce 属性或将其更改为 'ignore':
output['termination_date'] = pd.to_datetime(output_data['termination_date'], errors='ignore', format='%d-%m-%Y')
我有一个看起来像这样的 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
我正在尝试在我的代码中写一行简单的代码来过滤掉任何 termination_date < date.
的行所以输出看起来像这样:
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')
这是试图将 termination_date 变成我可以用来过滤的时间戳,但是 errors='coerce' 将所有值都变成了 NaN,因为没有它我会得到以下错误:
ValueError: time data '2019-07-30 00:00:00+00' does not match format '%d/%m/%Y' (match)
这是因为原始 termination_date 的格式为 "yyyy-mm-dd hh:mm:ss+00",所以我试图将其转换为与脚本其余部分相同的格式:"dd/mm/yyyy".
所以我想现在的问题是,如何将原始日期变成 dd/mm/yyyy,而不必传递错误='coerce'?
您需要这样做:
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
我觉得你的不平等的方向是这样的。应该是:
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())]
编辑:
根据您 post 的编辑部分,您正在将列转换为日期时间类型,但您使用的是斜线而不是数据样本中显示的连字符。你应该在你的函数中修改它。您还可以摆脱 coerce 属性或将其更改为 'ignore':
output['termination_date'] = pd.to_datetime(output_data['termination_date'], errors='ignore', format='%d-%m-%Y')