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

时间:2015-05-28 13:05:20

标签: python pandas merge

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

假设我想要将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

但我在使用合并功能。

1 个答案:

答案 0 :(得分:0)

如果您的DataFrame看起来像这样:

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']))

你可以连接所有的DataFrames:

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设置为索引是很自然的。然后,如果我们堆叠DataFrame,我们得到这个系列:

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()要求其余索引是唯一的。这意味着 没有重复的(date, id)条目。如果有重复的条目,那么它不清楚所需的输出应该是什么。解决该问题的一种方法是按dateid进行分组并汇总值。另一个选择是选择一个值并删除其他值。