Python 如何在pandas中合并/连接/合并索引上的数据帧
我有一个“空”的主数据帧df1和一些不同长度但与df1列相同的其他数据帧。我想在df1的某些索引位置上合并/加入/合并df2和df3:Python 如何在pandas中合并/连接/合并索引上的数据帧,python,pandas,Python,Pandas,我有一个“空”的主数据帧df1和一些不同长度但与df1列相同的其他数据帧。我想在df1的某些索引位置上合并/加入/合并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'
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开始。索引(3)和df3应该从df1开始。索引(12)在df2和df3之前、之间和之后保留df1的NAN。像这样使用
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
很不错的!很简单,谢谢。有没有一种方法可以包含df2和df3的键?您的要求有点混乱,您正在连接3个dfs并添加键参数,这实际上将创建一个多索引,级别0为[“”,'df2','df3']然后是关联的索引值,但您希望df2和df3行覆盖“”级别的值这只是我问题的一小部分。我发现多索引键对于更好的概述(对于像我这样的新手)以及以后的检查或单个数据帧(dataset)修改非常有用。我将df1作为键保留为空,因为我不需要它,nan的所有内容都是df1,但df2和df3可能在稍后阶段有用。。。如果只能分配所有键,即df1、df2、df3,也可以。