从旧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
相关产品推荐
相关产品推荐

