首页 > 解决方案 > 合并数据框和重复值

问题描述

我很难想出一个简单的合并逻辑。

 TimeSeries = A.merge(B, on = ['YEAR','MONTH'], how= 'left')

我有以下数据框。从 2001 年到 2018 年(12 个月 X 17 年)的连续月/年列

A:

|---------------------|------------------|
|       Month         |         Year     |
|---------------------|------------------|
|          12         |         2001     |
|---------------------|------------------|
|          01         |         2002     |
|---------------------|------------------|
|       ......        |        .....     |
|---------------------|------------------|
|          12         |         2018     |
|---------------------|------------------|

另一个具有唯一 ID、月份、年份和金额的数据框

乙:

 |-----------------|----------------|--------------|--------|
 |       Month     |       Year     |       ID     | Amount |
 |-----------------|----------------|--------------|--------|
 |          05     |       2013     |       2      | 500K   |
 |-----------------|----------------|--------------|--------|
 |          01     |       2002     |       1      | 200K   |
 |-----------------|----------------|--------------|--------|
 |          12     |       2016     |       3      | 800K   |
 |-----------------|----------------|--------------|--------|

我如何能够附加/合并两个数据框,以便数据框 B 中的每个 ID 都具有数据框 A 中的整个时间序列。它应该合并到正确的月份和年份列上。

ID 的所需输出。每个 ID 应该有 ~204 行,如果月份和年份相同,则显示正确的 $ 金额

 |---------------------|------------------|--------------|-----------|
 |       Month         |         Year     |       ID     |   Amount  |
 |---------------------|------------------|--------------|-----------|
 |          01         |         2001     |       1      |    NaN    |
 |---------------------|------------------|--------------|-----------|
 |          01         |         2002     |       1      |    200K   |
 |---------------------|------------------|--------------|-----------|
 |          12         |         2018     |       1      |    NaN    |
 |---------------------|------------------|--------------|-----------|

标签: pythonpandas

解决方案


你想要.reindex,这种方式ID是为每一行填写的。不需要DataFrameA:

import pandas as pd

names = ['Month', 'Year', 'ID']
idx = pd.MultiIndex.from_product([range(1, 13, 1), range(2001, 2019, 1), B.ID.unique()], 
                                 names=names)

B = B.set_index(names).reindex(idx).reset_index()

输出:

print(B.head())

#   Month  Year  ID Amount
#0      1  2001   2    NaN
#1      1  2001   1    NaN
#2      1  2001   3    NaN
#3      1  2002   2    NaN
#4      1  2002   1   200K

B.groupby('ID').size()
#ID
#1    216
#2    216
#3    216
#dtype: int64

性能笛卡尔积有办法优化产品,如果它相当慢


推荐阅读