You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从旧DataFrame切片建新DataFrame并指定行列为列名时全为NaN

解决DataFrame指定行设为列名后数据全为NaN的问题

问题场景

原DataFrame结构:

| 1 | 2 | 3 |
| - | - | - |
| a | b | c |
| d | e | f |
| g | h | i |
| k | l | m |

期望将第2行(值为d,e,f)设为新DataFrame的列名,后续行作为数据,得到:

| d | e | f |
| - | - | - |
| g | h | i |
| k | l | m |

问题原因

你当前的代码:

old_df = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['k', 'l', 'm']]
old_df = pd.DataFrame(old_df, columns=[1, 2, 3])
new_df = pd.DataFrame(old_df.iloc[2:, :], columns=old_df.iloc[1, :].values)

出现NaN的核心原因是:old_df.iloc[2:, :]的列名还是原有的[1,2,3],当你在pd.DataFrame()中指定新列名['d','e','f']时,pandas会因为列名完全不匹配,判定这些列没有对应数据,从而填充NaN。

正确解决方案

直接提取目标行作为新列名,再替换后续数据的列名即可,两种常用方式:

方式一:直接替换列名(简单直观)

import pandas as pd

old_df = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['k', 'l', 'm']]
old_df = pd.DataFrame(old_df, columns=[1, 2, 3])

# 提取要作为列名的行值
new_cols = old_df.iloc[1].values
# 提取后续行数据
new_data = old_df.iloc[2:].copy()
# 替换列名
new_data.columns = new_cols

# 可选:重置索引(去掉原有的行索引)
new_data = new_data.reset_index(drop=True)

方式二:用rename映射列名

如果需要保留原列名的映射关系,可以用rename方法:

new_cols = old_df.iloc[1].values
# 构建原列名到新列名的映射字典
col_mapping = dict(zip(old_df.columns, new_cols))
new_df = old_df.iloc[2:].rename(columns=col_mapping).reset_index(drop=True)

最终结果

运行后得到的new_df结构如下:

d  e  f
0  g  h  i
1  k  l  m

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:23