首页 > 解决方案 > 在忽略(或保留)NaN 的同时更改列格式

问题描述

我想将包含此格式值的 DataFrame 的列更改为包含hh:mm:ss分钟数的列(同时保留 NaN 值)

我无法直接从 excel 文件中更改它,所以我尝试使用 pandas 来进行更改(我正在研究带有健康数据库的 ML 模型):

38      00:35:00
39      00:50:00
40      00:45:00
41      01:32:00
42      00:29:00
43           NaN
44      00:45:00
45      00:13:00
46      00:20:00
47      00:31:00
48      00:54:00
49      00:43:00
50      02:33:00

我尝试使用掩码将值与 NaN 值分开,然后转换为分钟str.split()

df1 = df['delay'][df['delay'].notnull()].astype(str).str.split(':').apply(lambda x: int(x[0]) * 60 + int(x[1]))```
df2 = df['delai_ponc_recal_calc'][df['delai_ponc_recal_calc'].isnull()]

但是然后我不能在不丢失顺序的情况下合并到两个系列(我在合并系列的末尾获得了具有正确索引的 NaN 值)

39        50
40        45
41        92
42        29
44        45
45        13
46        20
47        31
48        54
49        43
50       153
43       NaN

我还尝试使用和使用循环(不使用掩码)从hh:mm:ss几分钟到几分钟,但在保持 NaN 的同时,我仍然不能在几分钟内拥有一个包含所有值的列(系列或 DF)...datatime.timetimedelta

标签: pythonpandasnan

解决方案


您可以使用pd.to_timedeltadelay列转换为 pandas timedelta 系列,然后将其除以Timedeltaof1 min以获得总分钟数:

pd.to_timedelta(df['delay'], errors='coerce') / pd.Timedelta(1, 'min')

39     50.0
40     45.0
41     92.0
42     29.0
43      NaN
44     45.0
45     13.0
46     20.0
47     31.0
48     54.0
49     43.0
50    153.0
Name: delay, dtype: float64

推荐阅读