重塑Pandas DataFrame:切片列并转为行的技术问题
解决Pandas宽表按列分组转多行的问题
首先得指出你当前代码里的几个关键问题:
DataFrame.append()已经被Pandas官方弃用了,现在推荐用pd.concat()来合并数据集,它更高效也更灵活。- 你的切片逻辑搞反了:
trdf.loc[:,i:i-20]里起始索引大于结束索引,Pandas会返回空的DataFrame,根本取不到你想要的20列数据。 - 就算切片正确,
append(包括concat)都是返回新的DataFrame,不会直接修改原对象,你得把结果赋值回去才行。
接下来给你正确的实现方案,完全贴合你的需求:从末尾开始每20列切片,把这些列的内容转成新行添加到DataFrame中。
假设你的trdf已经是现成的1行×420列的DataFrame,代码如下:
import pandas as pd # 初始化列表,用来存放所有要合并的行数据 rows_to_add = [] # 从末尾开始,每次取20列,步长-20 # range(420, 0, -20)会生成420、400、380...直到20,正好覆盖所有20列的分组 for i in range(420, 0, -20): # 取i-20到i的列(共20列),iloc按位置索引更适合连续列的切片 slice_group = trdf.iloc[:, i-20:i] # 如果需要统一列名(比如把每个分组的列名改成0-19),可以加这句 # slice_group = slice_group.rename(columns=lambda col: col % 20) rows_to_add.append(slice_group) # 合并所有行,ignore_index重置索引避免重复的0索引 trdf_updated = pd.concat(rows_to_add, ignore_index=True)
代码说明:
- 切片逻辑:用
iloc[:, i-20:i]来取连续20列,比如当i=420时,取的是第400到419列(正好是最后20列),完全符合你“从末尾开始”的要求。 - 合并方式:用
pd.concat替代弃用的append,批量合并所有切片后的行,效率更高。 - 索引重置:
ignore_index=True会把合并后的行索引重新从0开始编号,避免出现多个行索引为0的情况。
如果你还想保留原来那一行完整的420列数据,只需要在rows_to_add初始化时把原行加进去:
rows_to_add = [trdf]
这样最终的trdf_updated就会包含原行加上所有从末尾切出来的20列新行。
内容的提问来源于stack exchange,提问作者Arkistarvh Kltzuonstev
相关产品推荐
相关产品推荐

