pandas 中的 pd.concat 方法不遵守传递的 ignore_axis 参数

pd.concat method in pandas does not obey the ignore_axis argument passed

我对 pd.concat() 的以下行为感到困惑。

对于可重现的示例:

print(dff1)
   R1        R2        R3        R4        R5        R6        R7  \
0  0.471973  0.520696  0.002054  0.003792  0.468673  0.689152  0.832767   
1  0.692504  0.681589  0.006030  0.018702  0.329242  0.493711  0.510571   
2  0.456881  0.554278  0.003793  0.003721  0.539799  0.630306  0.649009   
3  0.622189  0.597208  0.001313  0.001932  0.242561  0.529820  0.467826   
4  0.605414  0.678142  0.041302  0.037944  0.386975  0.856687  0.419201   

         R8  
0  0.155941  
1  0.863021  
2  0.790688  
3  0.872659  
4  0.037814  

print(dff2)
 Id
22275  29668
11689  15503
54894  73108
19839  26429
55252  73574

dff3 = pd.concat([dff1, dff2], axis = 1, ignore_index = True)
print(dff3)
  0         1         2         3         4         5         6  \
0      0.471973  0.520696  0.002054  0.003792  0.468673  0.689152  0.832767   
1      0.692504  0.681589  0.006030  0.018702  0.329242  0.493711  0.510571   
2      0.456881  0.554278  0.003793  0.003721  0.539799  0.630306  0.649009   
3      0.622189  0.597208  0.001313  0.001932  0.242561  0.529820  0.467826   
4      0.605414  0.678142  0.041302  0.037944  0.386975  0.856687  0.419201   
11689       NaN       NaN       NaN       NaN       NaN       NaN       NaN   
19839       NaN       NaN       NaN       NaN       NaN       NaN       NaN   
22275       NaN       NaN       NaN       NaN       NaN       NaN       NaN   
54894       NaN       NaN       NaN       NaN       NaN       NaN       NaN   
55252       NaN       NaN       NaN       NaN       NaN       NaN       NaN   

              7        8  
0      0.155941      NaN  
1      0.863021      NaN  
2      0.790688      NaN  
3      0.872659      NaN  
4      0.037814      NaN  
11689       NaN  15503.0  
19839       NaN  26429.0  
22275       NaN  29668.0  
54894       NaN  73108.0  
55252       NaN  73574.0  

所以似乎 ignore_index 参数被忽略了,但我不明白为什么。

不,您需要 reset_indexdrop=True 作为输入的默认索引 DataFrames:

dff3 = pd.concat([dff1.reset_index(drop=True),
                  dff2.reset_index(drop=True)], axis = 1, ignore_index = True)

参数 ignore_index 用于列的默认索引,如果 axis=1 或索引,如果 axis=0 输出 DataFrame

但是另一个轴,axis=1 的索引是对齐的,所以你得到 NaN。如果使用 axis=0 则列对齐。

样本:

dff3 = pd.concat([dff1.reset_index(drop=True),
                  dff2.reset_index(drop=True)], axis = 1, ignore_index = True)
print (dff3)
          0         1         2         3         4         5         6  \
0  0.471973  0.520696  0.002054  0.003792  0.468673  0.689152  0.832767   
1  0.692504  0.681589  0.006030  0.018702  0.329242  0.493711  0.510571   
2  0.456881  0.554278  0.003793  0.003721  0.539799  0.630306  0.649009   
3  0.622189  0.597208  0.001313  0.001932  0.242561  0.529820  0.467826   
4  0.605414  0.678142  0.041302  0.037944  0.386975  0.856687  0.419201   

          7      8  
0  0.155941  29668  
1  0.863021  15503  
2  0.790688  73108  
3  0.872659  26429  
4  0.037814  73574  

如果省略参数ignore_index = True:

dff3 = pd.concat([dff1.reset_index(drop=True),
                  dff2.reset_index(drop=True)], axis = 1)
print (dff3)
         R1        R2        R3        R4        R5        R6        R7  \
0  0.471973  0.520696  0.002054  0.003792  0.468673  0.689152  0.832767   
1  0.692504  0.681589  0.006030  0.018702  0.329242  0.493711  0.510571   
2  0.456881  0.554278  0.003793  0.003721  0.539799  0.630306  0.649009   
3  0.622189  0.597208  0.001313  0.001932  0.242561  0.529820  0.467826   
4  0.605414  0.678142  0.041302  0.037944  0.386975  0.856687  0.419201   

         R8     Id  
0  0.155941  29668  
1  0.863021  15503  
2  0.790688  73108  
3  0.872659  26429  
4  0.037814  73574  

如果concat by indexaxis=0是默认参数,所以省略):

dff3 = pd.concat([dff1, dff2], ignore_index = True)
print (dff3)
        Id        R1        R2        R3        R4        R5        R6  \
0      NaN  0.471973  0.520696  0.002054  0.003792  0.468673  0.689152   
1      NaN  0.692504  0.681589  0.006030  0.018702  0.329242  0.493711   
2      NaN  0.456881  0.554278  0.003793  0.003721  0.539799  0.630306   
3      NaN  0.622189  0.597208  0.001313  0.001932  0.242561  0.529820   
4      NaN  0.605414  0.678142  0.041302  0.037944  0.386975  0.856687   
5  29668.0       NaN       NaN       NaN       NaN       NaN       NaN   
6  15503.0       NaN       NaN       NaN       NaN       NaN       NaN   
7  73108.0       NaN       NaN       NaN       NaN       NaN       NaN   
8  26429.0       NaN       NaN       NaN       NaN       NaN       NaN   
9  73574.0       NaN       NaN       NaN       NaN       NaN       NaN   

         R7        R8  
0  0.832767  0.155941  
1  0.510571  0.863021  
2  0.649009  0.790688  
3  0.467826  0.872659  
4  0.419201  0.037814  
5       NaN       NaN  
6       NaN       NaN  
7       NaN       NaN  
8       NaN       NaN  
9       NaN       NaN  

按列对齐,索引不变,因为没有参数ignore_index = True:

dff3 = pd.concat([dff1, dff2])
print (dff3)
            Id        R1        R2        R3        R4        R5        R6  \
0          NaN  0.471973  0.520696  0.002054  0.003792  0.468673  0.689152   
1          NaN  0.692504  0.681589  0.006030  0.018702  0.329242  0.493711   
2          NaN  0.456881  0.554278  0.003793  0.003721  0.539799  0.630306   
3          NaN  0.622189  0.597208  0.001313  0.001932  0.242561  0.529820   
4          NaN  0.605414  0.678142  0.041302  0.037944  0.386975  0.856687   
22275  29668.0       NaN       NaN       NaN       NaN       NaN       NaN   
11689  15503.0       NaN       NaN       NaN       NaN       NaN       NaN   
54894  73108.0       NaN       NaN       NaN       NaN       NaN       NaN   
19839  26429.0       NaN       NaN       NaN       NaN       NaN       NaN   
55252  73574.0       NaN       NaN       NaN       NaN       NaN       NaN   

             R7        R8  
0      0.832767  0.155941  
1      0.510571  0.863021  
2      0.649009  0.790688  
3      0.467826  0.872659  
4      0.419201  0.037814  
22275       NaN       NaN  
11689       NaN       NaN  
54894       NaN       NaN  
19839       NaN       NaN  
55252       NaN       NaN