如何将Pandas DataFrame两行值合并为新行并设置列名?
问题解决与实现方案
错误原因分析
你执行df = df.columns.astype(str)后,df变量被替换成了Index对象(原DataFrame列名转字符串后的索引),不再是原来的DataFrame,因此后续调用df.loc[0]会触发AttributeError——Index类型没有loc属性。这是代码中的核心问题。
符合Pandas风格的实现方法
以下是几种简洁高效的实现方式,完全满足你的需求:
方法1:列表推导式生成新列名
# 提取第一行数据,用于和原列名拼接 row0 = df.iloc[0] # 生成新列名:第一行值 + 下划线 + 原列名 new_columns = [f"{val}_{col}" for val, col in zip(row0, df.columns)] # 构建新DataFrame:保留第二行数据,重命名列,重置索引 new_df = df.iloc[1:].rename(columns=dict(zip(df.columns, new_columns))).reset_index(drop=True) # 保持索引列名称为'index' new_df.index.name = 'index'
方法2:矢量化操作(更简洁)
利用Pandas的矢量化特性,避免显式循环:
# 矢量化拼接生成新列名 new_columns = df.iloc[0].astype(str) + '_' + df.columns.astype(str) # 构建新DataFrame并设置列名、重置索引 new_df = df.iloc[1:].set_axis(new_columns, axis=1).reset_index(drop=True) new_df.index.name = 'index'
效果验证
原DataFrame结构:
| index | 1 | 2 |
|---|---|---|
| 0 | string1 | string2 |
| 1 | int_val1 | int_val2 |
执行代码后得到的新DataFrame:
| index | string1_1 | string2_2 |
|---|---|---|
| 0 | int_val1 | int_val2 |
内容的提问来源于stack exchange,提问作者Nick Seymour
相关产品推荐
相关产品推荐

