如何在不考虑行的特定部分的情况下删除部分包含 Nan 值的行?
How to remove rows that include partially Nan values without taking specific part of the row into account?
我正在处理多个大数据框架。我想自动删除他们的 NaN 部分以简化数据清理过程。数据是从相机或雷达馈送中收集的,但我需要的部分数据是特定物体何时进入相机/雷达的视界。因此,数据文件(框架)如下所示,并且有很多 NaN 值:
total in seconds datetime(utc) channels AlviraPotentialDronePlots_timestamp AlviraPotentialDronPlot_id ...
0 1601381457 2020-09-29 12:10:57 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 1601381459 2020-09-29 12:10:59 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 1601381460 2020-09-29 12:11:00 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 1601381461 2020-09-29 12:11:01 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 1601381463 2020-09-29 12:11:03 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... Useful data is here ... ... ... ... ... ... ... ... ...
623 1601382249 2020-09-29 12:24:09 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
624 1601382250 2020-09-29 12:24:10 NaN NaN NaN NaN NaN NaN NaN NaN ... 51.521264 5.858627 5.0 NaN NaN SearchRadar 0.0 0.0 NaN NaN
625 1601382251 2020-09-29 12:24:11 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我已经使用以下方法删除了包含所有 NaN 值的列:
df = df.dropna(axis=1, how='all')
现在,我想删除包含所有 NaN 的行。但是,由于 total in seconds
和 datetime(utc)
始终存在于文件中,我无法使用以下命令:
df = df.dropna(axis=0, how='all')
此外,我不能使用 how='any'
,因为那样也会删除部分有用的数据(有用的数据包含一些 NaN 值,我稍后会填充这些值)。我必须以不考虑 total in seconds
和 datetime(utc)
的方式使用 dropna()
,但如果所有其他字段都是 NaN,则删除整行。
我最接近解决这个问题的是中提到的命令,但我想我对Python还不够熟悉,无法制定以下逻辑:
- 如果在一行字段中 != [不是] 'total in seconds' | [or] 'datetime(utc)' & [and] other fields == [is] 'NaN' then remove the row
我也尝试用 for 循环 写这个,但我没有成功。有人可以帮我解决这个问题吗?
提前致谢。
您可以通过 subset
参数和 Index.difference
:
检查所有没有 total in seconds
、datetime(utc)
的列
cols = ['total in seconds','datetime(utc)']
checked = df.columns.difference(cols)
df = df.dropna(subset=checked, how='all')
如果你的列数是固定的,你可以使用参数thresh。
假设您有 50 列,如果您有 2 列从不为空,则可以将阈值设置为 48。
有关更多信息,请查看 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html
我正在处理多个大数据框架。我想自动删除他们的 NaN 部分以简化数据清理过程。数据是从相机或雷达馈送中收集的,但我需要的部分数据是特定物体何时进入相机/雷达的视界。因此,数据文件(框架)如下所示,并且有很多 NaN 值:
total in seconds datetime(utc) channels AlviraPotentialDronePlots_timestamp AlviraPotentialDronPlot_id ...
0 1601381457 2020-09-29 12:10:57 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 1601381459 2020-09-29 12:10:59 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 1601381460 2020-09-29 12:11:00 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 1601381461 2020-09-29 12:11:01 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 1601381463 2020-09-29 12:11:03 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... Useful data is here ... ... ... ... ... ... ... ... ...
623 1601382249 2020-09-29 12:24:09 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
624 1601382250 2020-09-29 12:24:10 NaN NaN NaN NaN NaN NaN NaN NaN ... 51.521264 5.858627 5.0 NaN NaN SearchRadar 0.0 0.0 NaN NaN
625 1601382251 2020-09-29 12:24:11 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我已经使用以下方法删除了包含所有 NaN 值的列:
df = df.dropna(axis=1, how='all')
现在,我想删除包含所有 NaN 的行。但是,由于 total in seconds
和 datetime(utc)
始终存在于文件中,我无法使用以下命令:
df = df.dropna(axis=0, how='all')
此外,我不能使用 how='any'
,因为那样也会删除部分有用的数据(有用的数据包含一些 NaN 值,我稍后会填充这些值)。我必须以不考虑 total in seconds
和 datetime(utc)
的方式使用 dropna()
,但如果所有其他字段都是 NaN,则删除整行。
我最接近解决这个问题的是
- 如果在一行字段中 != [不是] 'total in seconds' | [or] 'datetime(utc)' & [and] other fields == [is] 'NaN' then remove the row
我也尝试用 for 循环 写这个,但我没有成功。有人可以帮我解决这个问题吗?
提前致谢。
您可以通过 subset
参数和 Index.difference
:
total in seconds
、datetime(utc)
的列
cols = ['total in seconds','datetime(utc)']
checked = df.columns.difference(cols)
df = df.dropna(subset=checked, how='all')
如果你的列数是固定的,你可以使用参数thresh。 假设您有 50 列,如果您有 2 列从不为空,则可以将阈值设置为 48。 有关更多信息,请查看 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html