求助:Python大数字复制后末尾4位变0及代码适配问题
大数字截断问题及Python/Excel解决方案
需求与初始代码
最初需求:生成f列,规则如下:
- 当d列与e列值相同时,f列取当前行b列值
- 当d列与e列值不同时,f列取满足该行e列值与另一行d列值相同的对应行b列值
初始解决方案代码:
df['f'] = (df['b'].where(df['d'] == df['e']) .groupby(df['e']).transform('first') .astype(df['b'].dtype)) print(df)
测试数据适配问题
上述代码应用到测试数据集时无法运行,移除.astype(df['b'].dtype)后可正常执行。
测试数据集代码:
data = { 'column_1': [1, 2, 4, 2], 'column_2': [2, 3, 3, 2], 'column_3': ['value_1', 'value_2', 'value_3', 'value_4'] } dff = pd.DataFrame(data=data) print(dff)
修改后可运行的代码:
dff['column_4'] = (dff['column_3'].where(dff['column_1'] == dff['column_2']) .groupby(dff['column_2']).transform('first')) print(dff)
实际数据问题:大数字截断
将修改后的代码应用到推特数据集时,出现大数字精度丢失:b列为超过15位的大数字,生成的f列末尾4位被截断为0000(例如1234567890123450000)。当前Python中b、d、e列数据类型为int64,已尝试在Excel中以文本格式保存,但问题仍存在。
解决方法
Python端处理:转为字符串避免精度丢失
int64无法精确表示超过2^53的整数(约16位数字),会自动丢失精度,需将列转为字符串类型:
- 读取数据时指定类型
从Excel读取数据时,直接指定列类型为字符串:
import pandas as pd df = pd.read_excel('your_data.xlsx', dtype={'b': str, 'd': str, 'e': str})
- 转换现有列类型
若数据已加载到DataFrame,手动转换列类型:
df['b'] = df['b'].astype(str) df['d'] = df['d'].astype(str) df['e'] = df['e'].astype(str)
之后再执行生成f列的代码即可保留完整数字。
Excel端处理:确保文本格式生效
- 保存文件时,选中b、d、e列,设置单元格格式为「文本」后再保存
- 若已保存为数值格式,可通过公式
=TEXT(A1,"0")转换为文本格式,再复制为值,避免直接改格式不生效的问题
内容的提问来源于stack exchange,提问作者SEan1820
相关产品推荐
相关产品推荐

