使用to_csv()保存DataFrame后,导入时索引被识别为列的问题
解决Pandas保存自定义索引后读取时索引变列的问题
问题根源
你用df.to_csv()保存DataFrame时,默认不会把自定义索引当作"索引"写入CSV,而是会把它当成普通的一列存进去,所以再次读取时pandas就会把它识别成普通列,而非索引。
两种解决方法
方法1:保存时明确保留索引
修改你保存CSV的代码,添加index=True参数,让pandas把索引单独写入CSV的第一列,还可以给索引列指定名称(可选):
# 保存时保留索引,同时给索引列命名(比如你的索引是元素符号,就叫"元素符号") df.to_csv('period_table.csv', index=True, index_label='元素符号')
这样生成的CSV里,第一列就是你的自定义索引,后续读取时能直接对应上。
方法2:读取时指定索引列
如果已经保存了CSV不想重新生成,就在读取时用index_col参数告诉pandas哪一列是索引(默认保存的索引是第0列):
df = pd.read_csv('period_table.csv', index_col=0)
额外优化:简化你的原代码
原代码里手动循环拆分字符串的部分可以用pandas的str.split简化,避免低效的循环,同时避免固定长度导致的不匹配问题:
import pandas as pd import numpy as np # 直接读取CSV,无需额外转成DataFrame df = pd.read_csv('elementi.csv') # 拆分elementi列,直接生成两列数据 df[['elementi', '自定义索引']] = df['elementi'].str.split(';', expand=True) # 重新构建DataFrame并设置自定义索引 df = df.set_index('自定义索引')[['elementi']] # 移除不需要的元素(如果索引是数字类型,切片有效;如果是字符串需调整定位逻辑) df = df.drop(df.loc[103:117].index) df = df.drop(df.loc[90:104].index) df = df.drop(df.loc[58:72].index) # 根据当前DataFrame长度生成随机列,避免固定76导致的长度不匹配 row_count = len(df) ipo_oso = np.random.randint(0, 3, row_count) oso = np.random.randint(3, 5, row_count) ico = np.random.randint(5, 6, row_count) per_ico = np.random.randint(6, 7, row_count) # 添加列到DataFrame df['ipo_oso'] = ipo_oso df['oso'] = oso df['ico'] = ico df['per_ico'] = per_ico # 保存时保留索引 df.to_csv('period_table.csv', index=True)
内容的提问来源于stack exchange,提问作者drMAIN
相关产品推荐
相关产品推荐

