pandas通过multiindex从其他数据框架在数据框中创建额外的列

时间:2017-11-07 16:46:53

标签: python pandas

我有两个具有相同列名的pandas数据帧,以及相同的(两个)多索引列('符号'和' date')但是一些索引是不同的一些数据不同。

df1 index columns: ['symbol','date']
symbol  date     o    c
aa      2015/1/1 1    1
aa      2015/2/1 2    2
bb      2015/1/1 71   71

df2 index columns: ['symbol','date']

symbol  date     o    c
aa      2015/1/1 1    1
bb      2016/2/1 2    2
bb      2015/1/1 51   55

我首先要创建一个共享数据框,只包含两者中的行(带有默认dataframe.merge()的内部连接,并且只保留索引列。有没有办法一次性执行此操作?

目前我的做法很难:

merged = df1.merge(df2)  
analyzed = merged[['symbol','date']].copy

现在问题是:

我希望分析的数据框包含以下列:o1 c1 o2 c2 与两个文件中的数据。我如何" .loc"通过索引获取数据?

我想要类似下面的代码,但这会产生异常:

analyzed['o1'] = analyzed.apply(lambda row: df1['o'].loc[[row.symbol, row.date]]
# or maybe like this: 
analyzed['o1'] = analyzed.apply(lambda row: df1.at[ [row['symbol'], row['date']], 'o'] )

我该怎么做?或者(以另一种方式询问)如何获取当前行的符号和日期值,以及如何使用它们来设置df1(或df2)中的相应行?也许是get_level_values的东西?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

IIUC:

使用join:

analyze = df1.join(df2,lsuffix='_l')

输出:

                 o_l  c_l     o     c
symbol date                          
aa     2015/1/1    1    1   1.0   1.0
       2015/2/1    2    2   NaN   NaN
bb     2015/1/1   71   71  51.0  55.0

选择:

analyze.loc[('aa','2015/1/1')]

o_l    1.0
c_l    1.0
o      1.0
c      1.0
Name: (aa, 2015/1/1), dtype: float64

使用与索引合并:

analyze1 = df1.merge(df2, left_index=True, right_index=True)

输出:

                 o_x  c_x  o_y  c_y
symbol date                        
aa     2015/1/1    1    1    1    1
bb     2015/1/1   71   71   51   55

选择:

analyze1.loc[('aa','2015/1/1')]

o_x    1
c_x    1
o_y    1
c_y    1
Name: (aa, 2015/1/1), dtype: int64