Pandas自定义函数调用失效:float转字符串格式化问题解决
DataFrame列类型转换函数调用失效问题解决
问题背景
有两个DataFrame(df和df2),在进行Vlookup(即pandas的merge操作)时,需要将Item Class列(导入时为float类型且包含NaN)转换为固定4位格式的字符串。
两个DataFrame结构如下:
df
| Item Number | Item Description | Item Class | Item Class Description |
|---|---|---|---|
| ABC123 | Diamond | 0001 | Gemstone |
| ABC456 | Sapphire | 0001 | Gemstone |
| DEF000 | Silicon | 0002 | Mineral |
df2
| Item Class | Item Class Description |
|---|---|
| 0001 | Gemstone |
| 0002 | Mineral |
分步代码可以成功转换列格式:
df['Item Class']=df['Item Class'].fillna(value=0,inplace=False) df['Item Class']=df['Item Class'].astype(int,copy=True,errors='raise') df['Item Class']=df['Item Class'].astype(str,copy=True,errors='raise') df['Item Class']=df['Item Class'].apply('{:0>4}'.format) df2['Item Class']=df2['Item Class'].fillna(value=0,inplace=False) df2['Item Class']=df2['Item Class'].astype(int,copy=True,errors='raise') df2['Item Class']=df2['Item Class'].astype(str,copy=True,errors='raise') df2['Item Class']=df2['Item Class'].apply('{:0>4}'.format)
但自定义函数调用后无法生效,要么出现ValueError: You are trying to merge on float64 and object columns. If you wish to proceed you should use pd.concat错误,要么列类型仍为float:
def float_to_str(df_column): df_column=df_column.fillna(value=0,inplace=False) df_column=df_column.astype(int,copy=True,errors='raise') df_column=df_column.astype(str,copy=True,errors='raise') df_column=df_column.apply('{:0>4}'.format)
调用方式:
float_to_str(df['Item Class']) float_to_str(df2['Item Class'])
解决方案
1. 修复自定义函数(添加返回值)
你的函数没有返回处理后的列对象,导致调用后无法将结果赋值回DataFrame的列。修改后的函数如下:
def float_to_str(df_column): df_column = df_column.fillna(value=0, inplace=False) df_column = df_column.astype(int, copy=True, errors='raise') df_column = df_column.astype(str, copy=True, errors='raise') df_column = df_column.apply('{:0>4}'.format) # 关键:返回处理后的列 return df_column
2. 正确调用函数(赋值回原列)
调用时需要将函数返回的结果重新赋值给原DataFrame的Item Class列:
df['Item Class'] = float_to_str(df['Item Class']) df2['Item Class'] = float_to_str(df2['Item Class'])
3. 优化函数(链式调用简化代码)
可以把多步操作合并为链式调用,让函数更简洁:
def float_to_str(df_column): return df_column.fillna(0)\ .astype(int, errors='raise')\ .astype(str)\ .apply('{:0>4}'.format)
这样调用后,Item Class列会被正确转换为4位字符串格式,就可以正常进行merge(Vlookup)操作了。
内容的提问来源于stack exchange,提问作者user19891327
相关产品推荐
相关产品推荐

