Vaex合并列生成新列时整数转浮点数函数失效问题排查
解决方案
问题分析
- Vaex采用惰性计算机制,直接对列执行
astype('float')后不会立即生效,后续的astype('string')仍会基于原列类型处理 - 单纯转换浮点数再转字符串,无法保证固定输出
.00000的格式,需要显式指定格式化规则
修正后的函数
import vaex import pandas as pd import numpy as np def new_column_by_column_merging(df, columns=None): if columns is None: columns = df.get_column_names() if isinstance(columns, str): df['merged_column_key'] = df[columns].astype('string') return df # 初始化空字符串列 df['merged_column_key'] = '' for col in columns: # 判断列是否为数值类型(整数/浮点数) if df[col].dtype.kind in ['i', 'f']: # 格式化数值为保留5位小数的字符串,自动补全.00000 formatted_col = df[col].astype('float64').str.format('{:.5f}') else: # 非数值列直接转字符串 formatted_col = df[col].astype('string') # 拼接时避免开头出现多余下划线 df['merged_column_key'] = df['merged_column_key'] + ('_' if df['merged_column_key'] != '' else '') + formatted_col return df # 测试代码 pandas_df = pd.DataFrame({'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'Last Name': ['Johnson', 'Cameron', 'Biden', 'Washington'], 'Age': [20, 21, 19, 18], 'Weight': [60.0, 61.0, 62.0, 63.0]}) print('pandas_df is') print(pandas_df) df = vaex.from_pandas(df=pandas_df, copy_index=False) df_fixed = new_column_by_column_merging(df, ['Name', 'Age', 'Weight']) print('修正后的合并结果:') print(df_fixed[['Name', 'Age', 'Weight', 'merged_column_key']])
关键改进点
- 不修改原数据列:仅在拼接时临时格式化数值,避免破坏原始数据集
- 强制统一格式:用
str.format('{:.5f}')确保所有数值(无论整数/浮点数)都输出为带5位小数的字符串 - 优化拼接逻辑:避免合并列开头出现多余的下划线
- 适配Vaex惰性计算:所有操作基于Vaex表达式系统执行,确保计算生效
测试结果
输出的merged_column_key格式统一,例如:
Tom_20.00000_60.00000Joseph_21.00000_61.00000
这样无论两个数据集的同列类型是整数还是浮点数,合并后的连接键格式完全一致,解决了跨数据集连接时的类型不匹配问题。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

