我正在处理多个大数据框架。我希望自动删除它们的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不够熟悉,无法形成以下逻辑:
- if in one row field != [is not] 'total in seconds' | [or] 'datetime(utc)' &[和]其他字段== [is] 'NaN',然后删除
我也试着用for loop来写这个,但是我没有成功。有人能帮我一下吗?
提前感谢。
您可以使用Index.difference
:
total in seconds
,datetime(utc)
的subset
参数的所有列cols = ['total in seconds','datetime(utc)']
checked = df.columns.difference(cols)
df = df.dropna(subset=checked, how='all')
如果列数不变,可以使用参数thresh。假设你有50列,如果你有2列不为空,你可以把threh设为48。更多信息,请访问https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html