如何将Pandas列中JSON内的大数转换为int64类型?
问题:读取BigQuery嵌套表时大数精度丢失的处理
我使用pd.read_gbq读取BigQuery嵌套表:
data = pd.read_gbq(sql, project_id=project)
返回的DataFrame中,events列的单元格为JSON数组格式,示例如下:
[{'key': 'firebase_screen_id', 'value': {'string_value': None, 'int_value': -2.047602554786245e+18, 'float_value': None, 'double_value': None}}, {'key': 'ga_session_id', 'value': {'string_value': None, 'int_value': 1620765482.0, 'float_value': None, 'double_value': None}}]
其中int_value字段的-2.047602554786245e+18实际应为-2047602554786245165,但尝试以下方法均无法正确转换,单元格仍为包含精度丢失数值的对象数组:
data['events'].astype(str)
data.astype("Int64").astype(str)
请问如何获取完整整数并将该转换应用到整列?期望结果如下:
[{'key': 'firebase_screen_id', 'value': {'string_value': None, 'int_value': -2047602554786245165, 'float_value': None, 'double_value': None}}, {'key': 'ga_session_id', 'value': {'string_value': None, 'int_value': 1620765482.0, 'float_value': None, 'double_value': None}}]
解决方案
问题根源是BigQuery返回的超大整数被Python解析为浮点数,导致精度丢失。需要遍历每个嵌套字典,手动修复int_value的精度:
- 定义处理单个事件数组的函数:
def fix_int_values(events_list): for event in events_list: value_dict = event.get('value', {}) int_val = value_dict.get('int_value') if isinstance(int_val, float): # 用Decimal模块解析字符串,确保大数精度完全保留 from decimal import Decimal value_dict['int_value'] = int(Decimal(str(int_val))) return events_list
- 将函数应用到
events整列:
data['events'] = data['events'].apply(fix_int_values)
说明:直接将浮点数转int会丢失精度,通过Decimal解析字符串再转整数,可以完整保留原始大数的精确值。
内容的提问来源于stack exchange,提问作者mrDaft
相关产品推荐
相关产品推荐

