Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中合并/连接/合并索引上的数据帧_Python_Pandas - Fatal编程技术网

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

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和一些不同长度但与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', '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,也可以。