我正在对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会从整型变为浮点型?我怎样才能阻止它这样做?
1条答案
按热度按时间4c8rllxm1#
当你执行
apply
时,行被转换成一个普通的dtype,即float。如果你没有删除string列,这是不可能的,所以转换不会发生。建议您在the docs for
DataFrame.apply()
中不要执行以下操作:使传递的对象发生变化的函数可能会产生意外行为或错误,因此不受支持。有关详细信息,请参阅使用用户定义函数(UDF)方法进行变化。
相反,一次分配整个列,例如: