[英]How to merge/join/concat dataframes on index in 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。
您将无法使用这样的concat
实现所需的功能,或者无法重新索引就无法合并。 对于concat
,默认情况下将使用原始索引值,并将它们彼此堆叠在一起。 如果您尝试使用索引进行合并,则它们将发生冲突并创建附加列,例如'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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.