【Python基础-Pandas】解决Pandas会自动把None转成NaN的问题

1. 背景

目前dataframe中的数据如下,power字段表示功率值,第一个值为20.0,第二个值为None。需要计算电量值,电量 = 功率 * 0.25,并保存到energy字段中,如果功率值为None,则电量值也为None。

   power
0   20.0
1   None
df = pd.DataFrame(data={
        'power': [20, None]
    })

df['energy'] = df.apply(
            lambda col: Decimal(col['power']) * Decimal(0.25)
            if col['power'] is not None else None, 
            axis=1)
print(df)

结果如下:

   power energy
0   20.0   5.00
1    NaN    NaN

发现原本的None值被自动转成了NaN

2. 解决

Pandas会自动将Python中的None值转换为NaN("Not a Number"的缩写)值。NaN是Pandas中表示缺失数据的一种特殊值。这种自动转换是因为None通常用于表示缺失或空数据,而NaN是Pandas用于处理缺失数据的标准方式。

如果不希望Pandas自动将None转换为NaN,您可以在创建Series或DataFrame对象时明确指定dtype(数据类型),将其设置为适当的数据类型,以便None可以保持原样。

如下:

df = pd.DataFrame(data={
        'power': [20, None]
    }, dtype=object)

df['energy'] = df.apply(
            lambda col: Decimal(col['power']) * Decimal(0.25)
            if col['power'] is not None else None,
            axis=1)
print(df)

结果如下:

  power energy
0    20   5.00
1  None   None