如何在pandas中的索引上合并/连接/连接数据帧

时间:2014-09-23 10:56:29

标签: python pandas

我有一个主数据帧df1,它是空的'和其他一些不同长度但与df1列相同的数据帧。我想在df1的某些索引位置合并/ join / concat df2和df3:

df1 = pd.DataFrame(index=(np.arange(20)), columns=['A', 'B', 'C', 'D'])  
df2 = pd.DataFrame(randn(5, 4), columns=['A', 'B', 'C', 'D'])  
df3 = pd.DataFrame(randn(2, 4), columns=['A', 'B', 'C', 'D'])  
df4 = pd.concat([df1, df2, df3],axis=0, keys=['','df2','df3'])  

然而,concat([df1,df2,df3],axis = 0,keys ....)将dfs连续放在一起......

例如,df2应从df1.index(3)开始,df3应从df1.index(12)开始,在df2和df3之前,之间和之后留下df1的NAN。

1 个答案:

答案 0 :(得分:1)

您无法使用此类concat来实现您想要的功能,或者在没有重新索引的情况下进行合并。默认情况下,concat将使用原始索引值,并且只会将dfs堆叠在一起。如果您尝试使用索引进行合并,那么它们将发生冲突并创建其他列,例如' X_x,' X_y'等。

最简单的方法是重新索引dfs,然后调用update来覆盖所需行的NaN:

In [55]:

df1 = pd.DataFrame(index=(np.arange(20)), columns=['A', 'B', 'C', 'D'])  
df2 = pd.DataFrame(randn(5, 4), columns=['A', 'B', 'C', 'D'], index=arange(3,8))  
df3 = pd.DataFrame(randn(2, 4), columns=['A', 'B', 'C', 'D'], index=arange(12,14))  
df1.update(df2 )
df1.update(df3)
df1
Out[55]:
            A          B          C          D
0         NaN        NaN        NaN        NaN
1         NaN        NaN        NaN        NaN
2         NaN        NaN        NaN        NaN
3    1.315786 -0.4132373   1.084278  -0.945918
4    2.663868  0.8093393 -0.9853748  -1.428507
5   0.1414072  0.1896291   1.562247  0.1180398
6    1.699411   1.518535 -0.1854568  -0.430911
7   -1.716514   1.053428  0.3587436   1.471504
8         NaN        NaN        NaN        NaN
9         NaN        NaN        NaN        NaN
10        NaN        NaN        NaN        NaN
11        NaN        NaN        NaN        NaN
12 -0.5668472  -0.137524  0.1769178  0.7065836
13  -1.726548  0.2645793  0.1484438  -1.099373
14        NaN        NaN        NaN        NaN
15        NaN        NaN        NaN        NaN
16        NaN        NaN        NaN        NaN
17        NaN        NaN        NaN        NaN
18        NaN        NaN        NaN        NaN
19        NaN        NaN        NaN        NaN

因此您可以在创建后修改索引,如下所示:

In [56]:

df2 = pd.DataFrame(randn(5, 4), columns=['A', 'B', 'C', 'D'])
print(df2)
df2.index = index=arange(3,8)
df2
          A         B         C         D
0 -0.417199  0.184960 -1.056915  0.674005
1  0.592654  1.131421 -0.958991  0.831648
2 -1.087500  0.664596 -1.508290  2.453404
3  1.441886 -0.131998  0.040513 -2.675875
4  1.547340 -0.230203  1.335917 -1.568939
Out[56]:
          A         B         C         D
3 -0.417199  0.184960 -1.056915  0.674005
4  0.592654  1.131421 -0.958991  0.831648
5 -1.087500  0.664596 -1.508290  2.453404
6  1.441886 -0.131998  0.040513 -2.675875
7  1.547340 -0.230203  1.335917 -1.568939