如何将Pandas DataFrame连续3行合并为单行写入新DataFrame?
如何将Pandas DataFrame中每行与后续N行合并为单行
看起来你想要把原DataFrame里的每一行和它后面的2行打包成新DataFrame的一行,我来帮你修正代码并解释更高效的实现方式。
首先,先分析你现有代码里的几个问题:
- 你用了
df.items()来遍历,这其实是在遍历DataFrame的列,而不是行,所以index变量拿到的是列名,不是行索引,导致后续的iloc切片完全错误 - 你写的
index:index+6是想取6行,但你的需求是当前行+后续2行,总共3行 - 重复的列名会导致后续操作混乱,最好给合并后的列加个后缀区分
高效解决方案(用Pandas矢量化操作,避免循环)
Pandas的shift()方法是处理这种行移位需求的最佳工具,比循环遍历行高效得多,尤其是数据量大的时候。下面是完整的可运行代码:
import pandas as pd # 读取你的数据文件 path = r'C:\Users\Ahmed Ismail Khalid\Desktop\Research Paper\Training and Validation.csv' df = pd.read_csv(path) # 1. 获取当前行、下一行、下两行的数据,分别添加后缀区分(避免列名重复) df_current = df.add_suffix('_0') # 当前行,后缀_0 df_next1 = df.shift(-1).add_suffix('_1') # 下一行,后缀_1 df_next2 = df.shift(-2).add_suffix('_2') # 下两行,后缀_2 # 2. 按列拼接这三个DataFrame,得到每行对应原3行的新结构 new_df = pd.concat([df_current, df_next1, df_next2], axis=1) # 3. 删除最后2行(因为它们没有足够的后续行,会包含NaN) new_df = new_df.dropna() # 如果你一定要用重复的列名(不推荐,会导致索引混乱),可以执行下面这行 # new_df.columns = df.columns.tolist() * 3 print(new_df)
代码解释
shift(-1):把整个DataFrame向下移动一行,原来的第2行变成第1行,最后一行变成NaNadd_suffix():给每个列名加上后缀,比如F1变成F1_0,这样能清晰区分是原数据的哪一行concat([...], axis=1):把三个DataFrame按列拼在一起,形成每行包含原3行数据的新结构dropna():自动删除包含NaN的行,也就是原数据的最后2行,完美解决你提到的NaN问题
示例输出(用你提供的样例数据)
假设原数据是:
| F1 | F2 | F3 | F4 | Label |
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | Dog |
| 2 | 3 | 4 | 5 | Cat |
| 3 | 4 | 5 | 6 | Cat |
| 4 | 5 | 6 | 7 | Dog |
| 5 | 6 | 7 | 8 | Cat |
| 6 | 7 | 8 | 9 | Dog |
运行代码后得到的new_df(带后缀):
| F1_0 | F2_0 | F3_0 | F4_0 | Label_0 | F1_1 | F2_1 | F3_1 | F4_1 | Label_1 | F1_2 | F2_2 | F3_2 | F4_2 | Label_2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | Dog | 2 | 3 | 4 | 5 | Cat | 3 | 4 | 5 | 6 | Cat |
| 2 | 3 | 4 | 5 | Cat | 3 | 4 | 5 | 6 | Cat | 4 | 5 | 6 | 7 | Dog |
| 3 | 4 | 5 | 6 | Cat | 4 | 5 | 6 | 7 | Dog | 5 | 6 | 7 | 8 | Cat |
| 4 | 5 | 6 | 7 | Dog | 5 | 6 | 7 | 8 | Cat | 6 | 7 | 8 | 9 | Dog |
如果你去掉后缀,就会得到你想要的重复列名结构,但还是建议保留后缀,避免后续操作中因为列名重复出现问题。
内容的提问来源于stack exchange,提问作者Stevi G
相关产品推荐
相关产品推荐

