我在Python中有以下列表:
mylist = [float('NaN'), u'2', u'3', u'1', u'4', u'1/2', u'2/3', u'0']
我想将所有内容转换为int。我希望带有斜杠的字符串取第一个值。
这是我尝试过的:
newlist = [int(str(x).split('/')[0]) for x in mylist]
但这并不适用于NaN
值。处理字符串和NaN
值的最佳方法是什么?
答案 0 :(得分:1)
您可以使用数学库中的isnan函数来检查float是否为NaN,但是它将float作为参数,因此您必须先将项目转换为float。您可以选择是跳过NaN,还是将其保存为默认值。在下面的代码中,NaN被保存为int 0
import math
mylist = [float('NaN'), u'2', u'3', u'1', u'4', u'1/2', u'2/3', u'0']
newlist = []
for item in mylist:
x = float(str(item).split('/')[0])
if not math.isnan(x):
newlist.append(int(x))
else:
newlist.append(0)
print newlist
答案 1 :(得分:0)
我们知道, NaN总是!= NaN 使用以下方法将所有内容转换为整数:
mylist = [float('NaN'), u'2', u'3', u'1', u'4', u'1/2', u'2/3', u'0']
newList = [0 if (not item or (item != item)) else int(str(item).split('/')[0]) for item in mylist]
print(newList)
输出:
[0, 2, 3, 1, 4, 1, 2, 0]
答案 2 :(得分:0)
pandas.isnull
的另一个解决方案:
import pandas as pd
import numpy as np
mylist = [np.nan, u'2', u'3', u'1', u'4', u'1/2', u'2/3', u'0']
newList = [0 if pd.isnull(item) else int(str(item).split('/')[0]) for item in mylist]
print(newList)
[0, 2, 3, 1, 4, 1, 2, 0]
Pandas解决方案将NaN
替换为'0'
Series.fillna
,按str.split
拆分,按str[0]
获取列表的第一个元素,然后按{{3 }}:
mylist = [np.nan, u'2', u'3', u'1', u'4', u'1/2', u'2/3', u'0']
newList = pd.Series(mylist).fillna('0').str.split('/').str[0].astype(int)
print(newList)
0 0
1 2
2 3
3 1
4 4
5 1
6 2
7 0
dtype: int32
print(newList.tolist())
[0, 2, 3, 1, 4, 1, 2, 0]