Pandas Concat增加了行数

24

我正在将两个数据框串联在一起,所以我想要一个数据框位于另一个数据框之上。 但是在此之前,我对初始数据框进行了一些变换:

scaler = MinMaxScaler() 
real_data = pd.DataFrame(scaler.fit_transform(df[real_columns]), columns = real_columns)

然后连接:

categorial_data  = pd.get_dummies(df[categor_columns], prefix_sep= '__')
train = pd.concat([real_data, categorial_data], axis=1, ignore_index=True)

我不知道为什么,但是行数增加了:

print(df.shape, real_data.shape, categorial_data.shape, train.shape)
(1700645, 23) (1700645, 16) (1700645, 130) (1703915, 146)

发生了什么,如何解决这个问题?

正如您所看到的,train的列数等于real_data和categorial_data列数之和。


1
相关内容:https://dev59.com/hFwY5IYBdhLWcg3wRGBS和https://dev59.com/J6vka4cB1Zd3GeqPqD1I - EdChum
4个回答

36

问题在于,有时当您对单个数据帧对象执行多个操作时,索引会持久存在于内存中。因此,使用df.reset_index()将解决您的问题。


2
出现相同的问题时,为了增加精度,请在要连接在一起的数据帧上使用df.reset_index()方法,而不是在结果数据帧上使用。 - Nidupb

12

在对数据框进行某些操作时,其维数会发生改变,但索引不会改变,因此需要对数据框执行 reset_index 操作。

要进行连接操作,可以像这样做:

result_df = pd.concat([first_df.reset_index(drop=True), second_df.reset_index(drop=True)], axis=1)

4
我使用 hstack 解决了这个问题。
train = pd.DataFrame(np.hstack([real_data,categorial_data]))

4
这样做会丢失所有数据框的信息(例如列名、索引)。 - Tonca
@Tonca 我该如何保留所有数据框信息? - NewInPython
1
在这种情况下,列很容易保持不变,因为它们与原始数据框相同。问题出现在索引上。如果concat返回不同行数(如问题中所述),则意味着DF的索引不相同。我认为最好理解它们为什么不同,而不是强制进行连接。 - Tonca

1
这种情况发生在要拼接的数据框的索引不同的情况下。预处理后,结果数据框的索引会被移除。将每个数据框的索引设置回原始状态即可,例如: df_concatenated.index = df_original.index

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接