import pandas
import numpy
df=pandas.DataFrame({'col1':['a','b','c','b'],'col2':['N','2018-03-12 15:35',numpy.NaN,'2017-06-12 15:35'],'col3':['c','b','b','b']})
print(df)
以上脚本的输出为:
col1 col2 col3
0 a N c
1 b 2018-03-12 15:35 b
2 c NaN b
3 b 2017-06-12 15:35 b
对于列col2
,我想将所有yyyy-mm-dd hh:mm
格式的字符串转换为bool True
,将其他字符串转换为False
,并保持Na
的值不变。
预期结果如下:
col1 col2 col3
0 a False c
1 b True b
2 c NaN b
3 b True b
该怎么做? 预先感谢!
答案 0 :(得分:3)
创建2个遮罩-首先用errors='coerce'
转换to_datetime
s并测试Series.notna
,还测试此列:
m1 = pd.to_datetime(df['col2'], errors='coerce').notna()
m2 = df['col2'].notna()
然后将其传递给numpy.select
-但有必要将NaN
转换为None
:
df['col2'] = np.select([m1, m2], [True, False], None)
print(df)
0 a False c
1 b True b
2 c None b
3 b True b
或使用DataFrame.loc
:
df.loc[m2, 'col2'] = m1
print(df)
col1 col2 col3
0 a False c
1 b True b
2 c NaN b
3 b True b
答案 1 :(得分:1)
您可以使用类似的内容:
m=df.col2.notna()
df.loc[m,'col2']=(pd.to_datetime(df.col2.dropna(),errors='coerce').isna()
.map({True:False,False:True}))
print(df)
col1 col2 col3
0 a False c
1 b True b
2 c NaN b
3 b True b