我有一个主数据帧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。
答案 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