python - 根据索引和日期合并熊猫数据框
问题描述
我想合并/连接/... 2个数据帧,这样我得到下面的第三个数据帧(这是第一个数据帧的第一个数据帧+第一个数据帧的每个股票/日期组合的第一个数据帧+ var2):
第一个数据框:
dict1 = [{'date': '2016-11-29','var1': 'x1'},
{ 'date': '2016-11-29','var1': 'x2'},
{ 'date': '2016-11-29','var1': 'x3'},
{'date': '2016-11-29','var1': 'x4'},
{'date': '2016-11-30','var1': 'x5'},
{'date': '2016-11-30','var1': 'x6'}]
df1 = pd.DataFrame(dict1, index=['ge','jpm','fb', 'msft','ge','jpm'])
第二个数据框:
dict2 = [{'date': '2016-11-29','var2': 'y1'},
{ 'date': '2016-11-29','var2': 'y2'},
{ 'date': '2016-11-29','var2': 'y3'},
{'date': '2016-11-29','var2': 'y4'},
{'date': '2016-11-30','var2': 'y5'},
{'date': '2016-11-30','var2': 'y6'},
{'date': '2016-11-30','var2': 'y7'},
{'date': '2016-11-30','var2': 'y8'}]
df2 = pd.DataFrame(dict2, index=['aapl', 'msft','ge','jpm','aapl', 'msft','ge','jpm'])
第三个(目标)数据框:
dict3 = [{'date': '2016-11-29','var1': 'x1','var2': 'y3'},
{ 'date': '2016-11-29','var1': 'x2','var2': 'y4'},
{ 'date': '2016-11-29','var1': 'x3','var2': 'NaN'},
{'date': '2016-11-29','var1': 'x4','var2': 'y2'},
{'date': '2016-11-30','var1': 'x5','var2': 'y7'},
{'date': '2016-11-30','var1': 'x6','var2': 'y8'}]
df3 = pd.DataFrame(dict3, index=['ge','jpm','fb', 'msft','ge','jpm'])
请注意,数据框未对齐,因此合并应确保索引和日期相同。也就是说,索引和日期是唯一标识符。例如,在第三个数据框中,您可以看到第一行需要从日期“2016-11-29”开始的代码“ge”。此外,如前所述,我只需要 df1 中的数据,除此之外的任何 df2 都没有意义(即额外的日期或代码不相关)。
解决方案
您可以重置索引,合并索引列和日期列,并恢复索引:
df1.reset_index().merge(df2.reset_index(),
on=['index', 'date'], how='left')\
.set_index('index')
# date var1 var2
#index
#ge 2016-11-29 x1 y3
#jpm 2016-11-29 x2 y4
#fb 2016-11-29 x3 NaN
#msft 2016-11-29 x4 y2
#ge 2016-11-30 x5 y7
#jpm 2016-11-30 x6 y8
推荐阅读
- python - 在 dynamoDB 查询中使用字符串作为 FilterExpression 的参数
- excel-formula - 在 n , m 之间随机选择“x”列中的数字
- javascript - 允许用户键入特定键
- java - Java 如何在 Intellij 中找到 spark、Hadoop 和 AWS jars
- ruby - 为什么调用'is_a?方法上的对象'返回'true'?
- python - 我们如何解析 DataFrame.describe()?
- javascript - 在 Javascript 中使用 Promise 访问值
- angular - 使用 RxJS combineLatest 过滤 observables?
- reactjs - AnyChart-react 绘图在第二次渲染时消失
- java - Java 选择列表的元素