【pandas】pd.concat(col_1,col_2,...,axis=1)后行错位

项目场景:

  1. 使用pandas读取数据集为dataframe。
  2. 删除其中指定列的值为‘value’的行。
  3. 将待处理的每一列单独取出。例如:
    col_1 = data.loc[:,'col_1']
  4. 对数值为离散型的列执行label编码。例如:
    le = LabelEncoder()
    col_1= le.fit_transform(col_1)
    col_1= pd.DataFrame(col_1,columns=['col_1'])
  5. 使用pd.concat()将所有列拼接在一起组成新的数据集。

问题描述

出现了不该出现的NaN值,并且行索引不连续且最后一行的索引对不上结果的行数4603657,也对不上原始数据集的行数4603658。

正确情况下的结果的行数应为3706366行。并且在单独查看每列的行数时,每列都为3706366行。

                col_1      col_2  ...     col_19         col_20
0        1.525880e+09  1840724.0  ...        0.0            0.0
3        1.525880e+09   929496.0  ...        0.0            0.0
6        1.525880e+09  1669959.0  ...        0.0            0.0
11       1.525880e+09  2493102.0  ...        0.0            0.0
12       1.525880e+09  1645189.0  ...        0.0            0.0
...               ...        ...  ...        ...            ...
1209309           NaN  3610287.0  ...        NaN            NaN
1209311           NaN  3676148.0  ...        NaN            NaN
1209312           NaN  3653498.0  ...        NaN            NaN
1209315           NaN  1019301.0  ...        NaN            NaN
1209319           NaN  1752936.0  ...        NaN            NaN

[4603657 rows x 20 columns]

原因分析:

这是因为在第二步删除行后,行索引发生了改变,不再连续。例如从“0,1,2,3,…”变为“1,2,5,9,…”。当单独对数值为离散型的列使用label编码后,这些列的行索引被重置为连续的“0,1,2,3,…”。而数值为连续型的列因为没有执行任何操作,其行索引仍为“1,2,5,9,…”。当使用pd.concat(col_1,col_2,...,axis=1)将每列拼接时,会按照每列的行索引拼接,最终导致了行的错位。


解决方案:

将数值为连续型的列的行索引重置。例如:

col_2.reset_index(inplace=True,drop=True)

你可能感兴趣的:(数据处理,pandas)