如何通过Pandas DataFrame自连接实现交叉连接补充缺失行
问题:在Pandas中补充DataFrame的缺失维度组合行,填充数值列NaN
需要将DataFrame与自身进行类似交叉连接的操作,确保每个model对应所有version的记录都存在,补充year至version的缺失唯一组合行,缺失的数值列(value、value 2)填充NaN。
原数据示例:
| year | brand | series | model | version | value | value 2 |
|---|---|---|---|---|---|---|
| 2022 | bmw | A | 1X | plan | 3 | 1 |
| 2022 | bmw | B | 2X | plan | 8 | 1 |
| 2022 | bmw | A | 1X | sold | 1 | 1 |
| 2022 | bmw | C | 3X | sold | 10 | 1 |
| 2021 | bmw | A | 1X | sold | 50 | 20 |
| 2021 | bmw | C | 3X | sold | 50 | 20 |
| 2022 | bmw | A | 1X | prediction | 2 | 1 |
| 2022 | audi | D | 4X | prediction | 7 | 1 |
期望结果:
| year | brand | series | model | version | value | value 2 |
|---|---|---|---|---|---|---|
| 2022 | bmw | A | 1X | plan | 3 | 1 |
| 2022 | bmw | B | 2X | plan | 8 | 1 |
| 2022 | bmw | C | 3X | plan | NaN | NaN |
| 2022 | audi | D | 4X | plan | NaN | NaN |
| 2022 | bmw | A | 1X | sold | 1 | 1 |
| 2022 | bmw | C | 3X | sold | 10 | 1 |
| 2021 | bmw | A | 1X | sold | 50 | 20 |
| 2021 | bmw | C | 3X | sold | 50 | 20 |
| 2022 | audi | D | 4X | sold | NaN | NaN |
| 2022 | bmw | A | 1X | prediction | 2 | 1 |
| 2022 | audi | D | 4X | prediction | 7 | 1 |
| 2022 | bmw | B | 2X | prediction | NaN | NaN |
| 2022 | bmw | C | 3X | prediction | NaN | NaN |
解决方案代码:
import pandas as pd # 构造原数据DataFrame data = { 'year': [2022, 2022, 2022, 2022, 2021, 2021, 2022, 2022], 'brand': ['bmw', 'bmw', 'bmw', 'bmw', 'bmw', 'bmw', 'bmw', 'audi'], 'series': ['A', 'B', 'A', 'C', 'A', 'C', 'A', 'D'], 'model': ['1X', '2X', '1X', '3X', '1X', '3X', '1X', '4X'], 'version': ['plan', 'plan', 'sold', 'sold', 'sold', 'sold', 'prediction', 'prediction'], 'value': [3, 8, 1, 10, 50, 50, 2, 7], 'value 2': [1, 1, 1, 1, 20, 20, 1, 1] } df = pd.DataFrame(data) # 1. 提取所有唯一的维度组合(year、brand、series、model) unique_dimensions = df[['year', 'brand', 'series', 'model']].drop_duplicates() # 2. 提取所有唯一的version类型 unique_versions = df[['version']].drop_duplicates() # 3. 通过临时键实现交叉连接,生成所有可能的维度+version组合 unique_dimensions['temp_key'] = 1 unique_versions['temp_key'] = 1 all_possible_combinations = pd.merge(unique_dimensions, unique_versions, on='temp_key').drop('temp_key', axis=1) # 4. 左连接原数据,自动填充缺失的数值列为NaN final_result = pd.merge(all_possible_combinations, df, on=['year', 'brand', 'series', 'model', 'version'], how='left') # 输出结果 print(final_result)
代码说明:
drop_duplicates():获取唯一的维度组合和version类型,避免重复生成无效组合。- 临时键
temp_key:用于实现Pandas中的交叉连接(笛卡尔积),将每个维度组合与所有version进行配对。 how='left':左连接保留所有生成的组合行,原数据中不存在的组合对应的数值列会自动填充为NaN,完全匹配需求。
内容的提问来源于stack exchange,提问作者Freddie
相关产品推荐
相关产品推荐

