如何将Pandas DataFrame的'pos'列展开为多列并进行筛选?
展开'pos'列并筛选数据的实现方案
1. 展开'pos'列为多列
根据pos列的结构不同,选择对应的展开方式:
情况1:pos列是字典格式
直接用apply(pd.Series)展开后和原表拼接:
# 展开pos列并合并到原DataFrame expanded_df = df.join(df['pos'].apply(pd.Series))
如果是从JSON文件读取时就想直接展开嵌套结构,也可以用pd.json_normalize():
# 读取JSON时直接展开嵌套字段 df = pd.json_normalize(pd.read_json('your_file.json').to_dict('records'))
情况2:pos列是列表嵌套字典
先将列表拆分为多行(explode),再展开字典为列:
# 拆分pos列的列表为独立行 exploded_df = df.explode('pos') # 展开字典为多列并合并到原表 expanded_df = exploded_df.join(exploded_df['pos'].apply(pd.Series))
2. 执行筛选操作
展开完成后,使用Pandas常规筛选语法即可:
单条件筛选
# 筛选某列等于指定值的行 filtered_df = expanded_df[expanded_df['target_column'] == desired_value]
多条件筛选
注意用括号包裹每个条件,用&表示“且”,|表示“或”:
# 多条件组合筛选 filtered_df = expanded_df[(expanded_df['col1'] > 10) & (expanded_df['col2'] == 'valid')]
简洁筛选(query方法)
适合复杂条件的简洁写法:
filtered_df = expanded_df.query('col1 > 10 and col2 == "valid"')
完整示例
import pandas as pd # 模拟原始数据(pos列为字典) data = [ {"id": 1, "item": "pen", "pos": {"x": 2, "y": 5, "area": "desk"}}, {"id": 2, "item": "book", "pos": {"x": 7, "y": 3, "area": "shelf"}}, {"id": 3, "item": "cup", "pos": {"x": 4, "y": 6, "area": "desk"}} ] df = pd.DataFrame(data) # 展开pos列 expanded_df = df.join(df['pos'].apply(pd.Series)) # 筛选area为desk的行 filtered_df = expanded_df[expanded_df['area'] == 'desk'] print(filtered_df)
输出结果:
id item pos x y area 0 1 pen {'x': 2, 'y': 5, 'area': 'desk'} 2 5 desk 2 3 cup {'x': 4, 'y': 6, 'area': 'desk'} 4 6 desk
内容的提问来源于stack exchange,提问作者nima
相关产品推荐
相关产品推荐

