如何用Python Pandas筛选Twitter JSON数据集中country_code为gb的行?
解决Twitter JSON数据集批量筛选嵌套字段的问题
你遇到的核心问题是user_location是嵌套的字典结构,而不是简单的字符串,所以之前的两种方法都没法批量生效:
- 第一种硬编码索引
[4]的方式只能处理单条数据,没法遍历全量; - 第二种用
isin(["gb"])是在检查整个user_location字段是否等于字符串"gb",但它实际是个字典,自然匹配不上。
下面给你两种靠谱的批量筛选方案,都能帮你提取出country_code为"gb"的tweet_id:
方案一:用apply遍历判断(适合中小数据集)
这种方法直接对每一行的user_location字段做检查,还能处理数据格式不规范的情况(比如有的行user_location是空值或者不是字典):
import pandas as pd # 读取JSON Lines格式的数据 df = pd.read_json('example.json', lines=True) # 生成筛选掩码:判断user_location是字典,且country_code等于"gb" filter_mask = df['user_location'].apply( lambda x: isinstance(x, dict) and x.get('country_code') == 'gb' ) # 筛选符合条件的行,提取tweet_id列 valid_tweet_ids = df.loc[filter_mask, 'tweet_id'] # 输出结果,也可以转成列表保存 print(valid_tweet_ids.tolist())
代码说明:
isinstance(x, dict):先确保当前行的user_location是字典类型,避免遇到空值或非字典数据时报错;x.get('country_code'):用get方法比直接x['country_code']更安全,就算某个字典里没有country_code键,也只会返回None而不会崩溃;filter_mask是一个布尔数组,标记每一行是否符合筛选条件,最后用loc提取对应行的tweet_id。
方案二:用json_normalize展开嵌套结构(适合大数据集)
如果你的数据集很大,apply的效率可能不够高,这时可以用pd.json_normalize把嵌套的JSON结构展开成扁平的DataFrame,之后操作就和普通表格一样简单了:
import pandas as pd # 读取数据 df = pd.read_json('example.json', lines=True) # 把整个数据集的嵌套结构展开,用下划线连接层级字段名 normalized_df = pd.json_normalize(df.to_dict('records'), sep='_') # 直接筛选user_location_country_code等于"gb"的行,提取tweet_id valid_tweet_ids = normalized_df[normalized_df['user_location_country_code'] == 'gb']['tweet_id'] print(valid_tweet_ids.tolist())
代码说明:
pd.json_normalize(df.to_dict('records')):把DataFrame转成字典列表后,展开所有嵌套的字段,比如原来的user_location.country_code会变成新列user_location_country_code;- 展开后就可以像筛选普通列一样操作,效率比
apply高很多,尤其是数据量百万级以上时更明显。
额外注意事项
- 如果你的数据里有部分行的
user_location是None或者空字典,两种方案都能自动跳过这些行,不会报错; - 如果需要把结果保存到文件,可以用
valid_tweet_ids.to_csv('gb_tweet_ids.csv', index=False)导出成CSV文件。
内容的提问来源于stack exchange,提问作者zaraa s
相关产品推荐
相关产品推荐

