Pandas DataFrame拆分重命名列异常:df2列名以'ba'开头而非'b'
Pandas拆分DataFrame后列名修改异常:df2为何出现'ba'前缀?
嘿,我帮你揪出问题的根源了!先看你写的这段代码:
df1 = df[df['colname'==0]] df2 = df[df['colname'==1]] df1.columns = [ 'a'+ x for x in df1.columns] df2.columns = [ 'b'+ x for x in df2.columns]
第一个问题:布尔索引写法错误
你这里的df['colname'==0]完全写错了!'colname'==0是在比较字符串"colname"和数字0,结果永远是False,所以这行代码要么会报错,要么得到一个空的DataFrame,根本达不到按colname列的值拆分的目的。正确的写法应该是:
df[df['colname'] == 0]
要先取df['colname']列,再和0做比较,生成正确的布尔索引。
第二个核心问题:视图 vs 副本导致的列名污染
就算你把索引写法改对了,还是会出现df2列名变成ba开头的问题——因为你拆分出来的df1和df2都是原始df的视图,不是独立的副本!
Pandas在切片/布尔索引时默认返回视图(节省内存),所以当你修改df1.columns的时候,实际上是直接修改了原始df的列名。等你再拆分得到df2时,原始df的列名已经被改成a开头的了,这时候给df2的列名加b前缀,自然就变成了ba开头。
修正方案
解决办法很简单:拆分时用.copy()创建独立副本,同时修正索引写法:
# 正确拆分并生成独立副本 df1 = df[df['colname'] == 0].copy() df2 = df[df['colname'] == 1].copy() # 分别修改列名,互不影响 df1.columns = ['a' + x for x in df1.columns] df2.columns = ['b' + x for x in df2.columns]
这样df1和df2都是完全独立的DataFrame,修改各自的列名不会影响原始数据或彼此,df2的列名就会是你预期的b开头了!
内容的提问来源于stack exchange,提问作者Ethan.cy
相关产品推荐
相关产品推荐

