如何将Pandas单列按每3行一组拆分至三列?
问题:将Pandas单列DataFrame按3行一组重组为多列
现有一个包含数千行的Pandas单列DataFrame,示例如下:
0 0 \\\\path_1\\file1.csv 1 23082022 DS 2 520i2146002 3 \\\\path_2\\file2.csv 4 230822 NS 5 520i2146002 6 \\\\path_3\\file3.csv 7 24082022 DS 8 520i2146002
需要将每3行一组的后两行分别放入第二、第三列,目标输出如下:
0 1 2 0 \\\\path_1\\file1.csv 23082022 DS 520i2146002 1 \\\\path_2\\file2.csv 230822 NS 520i2146002 2 \\\\path_3\\file3.csv 24082022 DS 520i2146002
目前仅能通过以下代码提取奇偶行:
df = pd.DataFrame({0: df[0].iloc[::2].values, 'value': df[0].iloc[1::2].values})
寻求实现目标输出的解决方案。
解决方案
方法一:使用reshape快速重组(推荐,效率更高)
适合大数据量场景,直接通过数组变形实现:
import pandas as pd # 重置索引,避免原始索引不连续/重复导致的问题 df = df.reset_index(drop=True) # 将单列数据按每3行一组,重组为3列的DataFrame result = pd.DataFrame(df[0].values.reshape(-1, 3), columns=[0, 1, 2])
说明:reshape(-1, 3)会自动计算行数,把一维数组转换为N行3列的二维结构,直接传入pd.DataFrame即可得到目标格式。
方法二:使用groupby分组重组
如果需要更灵活的分组逻辑,可以用分组方式实现:
# 按行号整除3生成分组键,每个组对应一组3行数据 result = df.groupby(df.index // 3)[0].apply(pd.Series).reset_index(drop=True)
说明:df.index // 3为每3行生成相同的分组标识,apply(pd.Series)会把组内的3个元素展开为3列,最后重置索引得到连续行号。
两种方法均可实现需求,其中reshape方法在处理数千行数据时速度更快。
内容的提问来源于stack exchange,提问作者user10511899
相关产品推荐
相关产品推荐

