python - 合并数据框和重复值
问题描述
我很难想出一个简单的合并逻辑。
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 |
|---------------------|------------------|--------------|-----------|
解决方案
你想要.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
性能笛卡尔积有办法优化产品,如果它相当慢
推荐阅读
- html - 悬停最后一个孩子时嵌套的div也悬停在父级上
- android - 如何识别来自我的应用程序的 http post API 请求?
- vb.net - 滚动父控件时如何获取可见的子控件?
- command-line - 使用 SentencePiece 作为命令
- c# - 如何将不可见背景应用于面板上的控件?(C#)
- c# - c#关键字'user'附近的语法不正确
- java - 加载资源 css 文件失败。自由标记
- woocommerce - 每个产品的 WooCommerce 运输成本 - 1 个国家/地区的 1 个价格和其他国家/地区的另一个价格
- javascript - 在 Edge 和其他浏览器上未定义隐藏字段
- javascript - 在 Google Cloud Functions 中表达