繁体   English   中英

在忽略(或保留)NaN 的同时更改列格式

[英]Change a column format while ignoring (or keeping) NaN

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

我不能直接从 excel 文件更改它,所以我尝试使用 pandas 来更改它(我正在使用带有健康数据库的 ML model):

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

我还尝试使用循环(不使用掩码)将 go 从hh:mm:sstimedelta datatime.time分钟,但我仍然无法在分钟内拥有包含所有值的列(系列或 DF)保留 NaN ...

您可以使用pd.to_timedeltadelay列转换为 Pandas timedelta 系列,然后将其Timedelta 1 minTimedelta以获得总分钟数:

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

以下是一些可能的解决方案:

输入

       delay
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

方法一: pd.to_datetime + map

df['delay'] = pd.to_datetime(df['delay'])

#using lambda function 
df['delay2'] = df['delay'].map(lambda x : x.hour*60 + x.minute)

print(df['delay2'])
#df.drop(['delay'],axis=1,inplace=True) 

方法二: pd.to_datetime + dt

#converts time columns to pandas datetime64ns format
df['delay'] = pd.to_datetime(df['delay']) 

#using dt to extract hour and minute data
df['delay2'] = df['delay'].dt.hour*60 + df['delay'].dt.minute 
print(df['delay2'])

输出

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: Time, dtype: float64

对于一般情况,您可以使用errors='ignore' ,如下所示:

df['column_name'].astype(int, errors='ignore')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM