You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IP2LocationRecord转换为Pandas DataFrame时的报错与空DataFrame问题咨询

解决IP2LocationRecord转Pandas DataFrame的问题

我之前处理IP2Location数据的时候也踩过同样的坑,来给你详细说下怎么搞定~

首先得搞清楚问题出在哪:你从IP2Location拿到的IP2LocationRecord看起来像字典,但其实是自定义类的实例,不是标准的Python字典,这就是为什么pd.json_normalize会报错找不到values属性,直接用pd.DataFrame传单个对象也会得到空表。

解决方案步骤

1. 先把IP2LocationRecord转成标准字典

我们可以用vars()函数(或者直接访问对象的__dict__属性)把这个自定义对象转换成普通字典:

# 假设你的IP2Location记录对象叫ip_record
ip_dict = vars(ip_record)
# 或者用 ip_dict = ip_record.__dict__

转换后就得到你示例里那种键值对格式的字典了。

2. 用Pandas创建DataFrame

这时候有两种靠谱的方式:

方式一:用pd.DataFrame创建(指定列名)

注意要把字典放到列表里,不然Pandas会把单个字典当成列数据而不是行数据:

# 指定你需要的列名
columns = ['ip','country_short','country_long','region','city','latitude','longitude','zipcode','timezone']
df = pd.DataFrame([ip_dict], columns=columns)
方式二:用pd.json_normalize(更省心)

转成字典后,json_normalize就能正常处理了,甚至不需要手动指定列:

df = pd.json_normalize(ip_dict)

如果是批量处理多个IP记录,只需要把所有转换后的字典放到一个列表里,再传给pd.DataFrame或者pd.json_normalize就行,比如:

# 假设records是多个IP2LocationRecord对象的列表
dict_list = [vars(record) for record in records]
df = pd.DataFrame(dict_list, columns=columns)
# 或者 df = pd.json_normalize(dict_list)

为什么之前的方法失效?

  • pd.json_normalize只认标准的字典/字典列表,自定义类实例没有它需要的values方法,所以触发AttributeError;
  • 直接传单个字典给pd.DataFrame时,Pandas会把字典的键作为列名,每个键对应的值作为该列的全部数据,但单个标量值无法组成行,所以最终只有列名没有数据。

内容的提问来源于stack exchange,提问作者asfjl1123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:34:09