合并数据框并重复值

时间:2019-06-04 13:45:54

标签: python pandas

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

 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    |
 |---------------------|------------------|--------------|-----------|

1 个答案:

答案 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有办法优化产品(如果速度很慢)