为什么Pandas在运行apply时将现有列从int转换为float?

dgiusagp  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(191)

我正在对Pandas Dataframe 进行一些操作,具体来说:

  • 删除列
  • 使用dataframe.apply()函数基于现有列添加列

下面是我能够创建的最简单的测试用例:

import pandas as pd

df = pd.DataFrame(
    [["Fred", 1, 44],
     ["Wilma", 0, 39],
     ["Barney", 1, None]],
    columns=["Name", "IntegerColumn", "Age" ])

def translate_age(series):
    if not np.isnan(series['Age']):    
        series["AgeText"] = "Over 40" if series["Age"] > 40 else "Under 40"
    else:
        series["AgeText"]  = "Unknown"
    return series
    
df = df.drop('Name', axis=1)
print('@ before', df['IntegerColumn'].dtypes)
df = df.apply(func=translate_age, axis=1)
print('@ after', df['IntegerColumn'].dtypes)

print()输出显示了IntegerColumn类型的变化。它以整数开始:

@ before int64

...然后在apply()调用之后,它将变为浮点型:

@ after float64

最初, Dataframe 如下所示:

Name  IntegerColumn   Age
0    Fred              1  44.0
1   Wilma              0  39.0
2  Barney              1   NaN

...在apply()调用之后,它看起来像这样:

IntegerColumn   Age   AgeText
0            1.0  44.0   Over 40
1            0.0  39.0  Under 40
2            1.0   NaN   Unknown

为什么在这种情况下IntegerColumn会从整型变为浮点型?我怎样才能阻止它这样做?

4c8rllxm

4c8rllxm1#

当你执行apply时,行被转换成一个普通的dtype,即float。如果你没有删除string列,这是不可能的,所以转换不会发生。
建议您在the docs for DataFrame.apply()中不要执行以下操作:

    • 说明**

使传递的对象发生变化的函数可能会产生意外行为或错误,因此不受支持。有关详细信息,请参阅使用用户定义函数(UDF)方法进行变化。
相反,一次分配整个列,例如:

def translate_age(age):
    if np.isnan(age):
        return "Unknown"
    return "Over 40" if age > 40 else "Under 40"

df['AgeText'] = df['Age'].apply(translate_age)

相关问题