首页 > 解决方案 > 遇到 NaN 值时可迭代的 TypeError

问题描述

我有一个包含 NaN 值的数据框

df:
         score home_odds draw_odds away_odds
0          1:0    59/100   263/100    231/50
1          2:1     24/25     53/20   237/100
2          0:2   221/100     93/50     67/50
3          1:1    259/50   251/100     16/25
.......
1970       NaN     36/25   197/100     47/25
1971       NaN       NaN       NaN       NaN
1972       NaN       NaN       NaN       NaN
1973       NaN       NaN       NaN       NaN
1974       NaN      17/5   263/100     39/50
1975       NaN     77/50     21/10       7/4
1976       NaN     19/50     86/25   691/100
1977       NaN       NaN       NaN       NaN

当我尝试使用转换公式将小数值转换为十进制时

例如:

123/100 = (123/100 + 1) = 2.23

333/100 = (333/100 +1) = 4.33

计算为小数值 + 1

当然,保留十进制值与代码一样:

def convert(s):
    if '/' in s:  # is a fraction
        num, den = s.split('/')
        return 1 + (int(num) / int(den))
    else:
        return float(s)

df['home_odds'] = df['home_odds'].apply(convert)
df['away_odds'] = df['away_odds'].apply(convert)
df['draw_odds'] = df['draw_odds'].apply(convert)

我收到错误消息:

    if '/' in s:  # is a fraction
TypeError: argument of type 'float' is not iterable

当我删除NaN值时,公式有效。

我想将NaN值保留在数据框中并仅转换非值NaN

我该怎么做?

标签: pythonpandasdataframeapplyconverters

解决方案


检查函数开头的数据是否Nan(即 a ):float

def convert(s):
    if pd.isnull(s):
        return s
    if '/' in s:  # is a fraction
        num, den = s.split('/')
        return 1 + (int(num) / int(den))
    else:
        return float(s)

推荐阅读