首页 > 解决方案 > 为什么 Pandas 列切片会根据列命名给出不同的结果?

问题描述

在执行数据帧合并时遇到内存错误后,我发现 pandas 列切片中的一个相当奇特的行为。下面是观察到的行为示例。数据框是相同的,除了被重命名的列而df4不是df3.

但是,当对帧进行列切片时,对于其中一个,数字列是重复的,而对于另一个,切片的行为符合预期。

这里有任何熊猫向导以前经历过这种情况吗?如果是这样,是否有任何触发行为的方法,所以可以完全避免。

df3
Out[1138]: 
              A    B       C       D
Date                                
2017-03-31  NaN  NaN  2.9511  2.9511
2017-03-30  NaN  NaN  2.9009  2.9009
2017-03-29  NaN  NaN  2.9356  2.9356
2017-03-28  NaN  NaN  2.9008  2.9008
2017-03-27  NaN  NaN  2.8576  2.8576

df4
Out[1139]: 
           Feb16 Mar16   Mar17   Mar17
Date                                  
2017-03-31   NaN   NaN  2.9511  2.9511
2017-03-30   NaN   NaN  2.9009  2.9009
2017-03-29   NaN   NaN  2.9356  2.9356
2017-03-28   NaN   NaN  2.9008  2.9008
2017-03-27   NaN   NaN  2.8576  2.8576

df3[df3.columns]
Out[1140]: 
              A    B       C       D
Date                                
2017-03-31  NaN  NaN  2.9511  2.9511
2017-03-30  NaN  NaN  2.9009  2.9009
2017-03-29  NaN  NaN  2.9356  2.9356
2017-03-28  NaN  NaN  2.9008  2.9008
2017-03-27  NaN  NaN  2.8576  2.8576

df4[df4.columns]
Out[1141]: 
           Feb16 Mar16   Mar17   Mar17   Mar17   Mar17
Date                                                  
2017-03-31   NaN   NaN  2.9511  2.9511  2.9511  2.9511
2017-03-30   NaN   NaN  2.9009  2.9009  2.9009  2.9009
2017-03-29   NaN   NaN  2.9356  2.9356  2.9356  2.9356
2017-03-28   NaN   NaN  2.9008  2.9008  2.9008  2.9008
2017-03-27   NaN   NaN  2.8576  2.8576  2.8576  2.8576

标签: pythonpandas

解决方案


为什么我认为通过为多个列提供相同名称来引入此行为的示例:

创建示例 df

df = pd.DataFrame({x: np.random.random(2) for x in ['A1', 'A2']})

         A1        A2
0  0.217047  0.224265
1  0.454130  0.304111

列索引按要求工作:

df[df.columns]

         A1        A2
0  0.217047  0.224265
1  0.454130  0.304111

将列重命名为非唯一列表:

df.columns = df.columns.str[0]

          A         A
0  0.217047  0.224265
1  0.454130  0.304111

从问题帖子中复制错误:

df[df.columns]

          A         A         A         A
0  0.217047  0.224265  0.217047  0.224265
1  0.454130  0.304111  0.454130  0.304111

推荐阅读