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_index
和 drop=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 index
(axis=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
我对 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_index
和 drop=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 index
(axis=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