如何将Pandas DataFrame的X/Y/Z列转换为含1500列的新DataFrame?
如何将三列Pandas DataFrame转换为1500列的新DataFrame?
问题描述
我有一个包含X、Y、Z三列的Pandas DataFrame,每列包含10万条数据。希望创建一个新的Pandas DataFrame,其列名为X0、X1……X499、Y0、Y1……Y499、Z0、Z1……Z499(总计1500列),新DataFrame的行数据取自原DataFrame。
尝试的代码
data1 = pd.read_excel('/content/sattle1.2.xlsx') X_np = data1['X'].to_numpy() Y_np = data1['Y'].to_numpy() Z_np = data1['Z'].to_numpy() i = 0 for i in range(len(X_np)): # append 500 of x, y, and z row = np.concatenate(X_np[0:500], Y_np[0:500], Z_np[0:500]) row = pd.DataFrame(row).T # append this row to the result DataFrame result1 = pd.concat([result1, row], ignore_index=True)
原代码存在的问题
- 性能极差:循环10万次调用
pd.concat,每次操作都会复制整个DataFrame,时间复杂度为O(n²),处理10万条数据会异常缓慢。 - 语法错误:
np.concatenate需要传入数组列表作为参数,正确写法应为np.concatenate([X_np[0:500], Y_np[0:500], Z_np[0:500]])。 - 逻辑不符需求:每次循环都取原数据的前500条,导致新DataFrame所有行内容完全相同,不符合“行数据取自原DataFrame不同位置”的实际需求(推测你需要滑动窗口式的连续数据截取)。
高效实现方案
假设需求是:新DataFrame的第i行由原DataFrame中X列的第i到i+499个元素、Y列的第i到i+499个元素、Z列的第i到i+499个元素组成(滑动窗口截取),最终新DataFrame行数为100000 - 500 + 1 = 99501行,列数1500。
实现代码:
import pandas as pd import numpy as np # 读取数据 data1 = pd.read_excel('/content/sattle1.2.xlsx') window_size = 500 # 生成各列的滑动窗口数组(numpy 1.20+支持sliding_window_view) X_window = np.lib.stride_tricks.sliding_window_view(data1['X'].to_numpy(), window_size) Y_window = np.lib.stride_tricks.sliding_window_view(data1['Y'].to_numpy(), window_size) Z_window = np.lib.stride_tricks.sliding_window_view(data1['Z'].to_numpy(), window_size) # 按列拼接三个窗口数组 combined_data = np.concatenate([X_window, Y_window, Z_window], axis=1) # 生成列名 columns = [f'X{i}' for i in range(window_size)] + \ [f'Y{i}' for i in range(window_size)] + \ [f'Z{i}' for i in range(window_size)] # 创建最终DataFrame result1 = pd.DataFrame(combined_data, columns=columns)
说明
- 使用
np.lib.stride_tricks.sliding_window_view生成滑动窗口,无需复制数据,内存和时间效率极高。 - 一次性拼接所有数据后转为DataFrame,避免循环中的重复复制操作。
- 列名严格按照X0-X499、Y0-Y499、Z0-Z499的规则生成。
内容的提问来源于stack exchange,提问作者Dhuha Firas
相关产品推荐
相关产品推荐

