我很难提出一个简单的合并逻辑。
TimeSeries = A.merge(B, on = ['YEAR','MONTH'], how= 'left')
我有以下数据框。从2001年至2018年的连续月/年列(12个月X 17年)
A:
|---------------------|------------------|
| Month | Year |
|---------------------|------------------|
| 12 | 2001 |
|---------------------|------------------|
| 01 | 2002 |
|---------------------|------------------|
| ...... | ..... |
|---------------------|------------------|
| 12 | 2018 |
|---------------------|------------------|
另一个具有唯一ID,月,年和$金额的数据框
B:
|-----------------|----------------|--------------|--------|
| 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 |
|---------------------|------------------|--------------|-----------|
答案 0 :(得分:1)
您要.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
Performant Cartesian Product有办法优化产品(如果速度很慢)