Python 熊猫:将数据帧添加到数据帧-索引和列值匹配

Python 熊猫:将数据帧添加到数据帧-索引和列值匹配,python,pandas,merge,Python,Pandas,Merge,我正在尝试将pandas dataframes添加到另一个具有不同长度的dataframe,以便结果中的值与(时间)索引和所有dataframes中存在的列中的键值对齐 假设我要合并df1、df2和df3,并在索引和列“id”上合并: df1 id value1 2015-05-01 1 13 2015-05-01 2 14 2015-05-02 1 15 2015-05-02 2 16 df2 i

我正在尝试将pandas dataframes添加到另一个具有不同长度的dataframe,以便结果中的值与(时间)索引和所有dataframes中存在的列中的键值对齐

假设我要合并df1、df2和df3,并在索引和列“id”上合并:

df1
            id value1
2015-05-01   1     13
2015-05-01   2     14
2015-05-02   1     15
2015-05-02   2     16

df2
            id  value2
2015-05-01   1       4
2015-05-02   1       5

df3
            id  value2
2015-05-01   2       7
2015-05-02   2       8
我想要的是得到一个看起来像

df
            id   value1 value2
2015-05-01   1       13      4
2015-05-01   2       14      7
2015-05-02   1       15      5
2015-05-02   2       16      8

但我很难处理合并函数

如果您的数据帧如下所示:

import datetime as DT
import numpy as np
import pandas as pd

df1 = pd.DataFrame({'id':[1,2,1,2], 'value1':[13,14,15,16]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-1', '2015-5-2', '2015-5-2']))
df2 = pd.DataFrame({'id':[1,1], 'value2':[4,5]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
df3 = pd.DataFrame({'id':[2,2], 'value2':[7,8]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
您可以连接所有数据帧:

df = pd.concat([df1,df2,df3])
#             id  value1  value2
# 2015-05-01   1      13     NaN
# 2015-05-01   2      14     NaN
# 2015-05-02   1      15     NaN
# 2015-05-02   2      16     NaN
# 2015-05-01   1     NaN       4
# 2015-05-02   1     NaN       5
# 2015-05-01   2     NaN       7
# 2015-05-02   2     NaN       8
由于结果在日期和
id
上都是一致的,因此将
id
设置为索引是很自然的。然后,如果我们堆叠数据帧,我们将得到以下系列:

series = df.set_index(['id'], append=True).stack()
#             id        
# 2015-05-01  1   value1    13
#             2   value1    14
# 2015-05-02  1   value1    15
#             2   value1    16
# 2015-05-01  1   value2     4
# 2015-05-02  1   value2     5
# 2015-05-01  2   value2     7
# 2015-05-02  2   value2     8
# dtype: float64
现在,如果我们翻转并取消堆叠序列,则值将根据剩余索引对齐--日期和
id

result = series.unstack()
屈服

               value1  value2
           id                
2015-05-01 1       13       4
           2       14       7
2015-05-02 1       15       5
           2       16       8
请注意,
unstack()
要求剩余索引是唯一的。这意味着
没有重复的
(日期,id)
条目。如果存在重复条目,则不清楚所需的输出应该是什么。解决此问题的一种方法是按
日期
id
进行分组,并聚合值。另一种选择是选择一个值并删除其他值。

但是如果“值”是要添加的新列,并且我不想执行任何分组操作,我该怎么办?在上面的Q中,请将实际值添加到
df1
并显示所需的输出。我按要求添加了值。请注意,“value2”在df2和df3中是同一列,但与df1中的value1不同。我希望这会越来越清楚。谢谢!我还发现,如果我将所有数据帧索引转换为pd.MultiIndex(date,id),然后简单地执行
df=df1.join(df2).join(df3)
听起来您的真实数据帧一定与这里发布的示例有所不同,因为这里
df1.join(df2).join(df3)
引发一个
值错误:列重叠…
异常。