Python 3.x Python/Pandas:基于条件/索引重命名DataFrame中的多个列名

Python 3.x Python/Pandas:基于条件/索引重命名DataFrame中的多个列名,python-3.x,pandas,rename,Python 3.x,Pandas,Rename,我对蟒蛇和熊猫很陌生。到目前为止,我试图在论坛上找到答案,但没有成功 我的问题如下: 我从excel导入了一个数据框,其中有两列包含参数描述(字符串),包含周数据的可变列数(4到5列,取决于一个月的周数;01.mm.yyyy到(比如)28.mm.yyyy)以及包含月数据的列 我需要将每月数据的前2个字符重命名为(因此,从第6列或第7列开始),列名称字符串从01重命名为(比如)25 例如: 可乐 可乐 第1-4周 01.01.2021 01.02.2021 ... 1111 2222 ....

我对蟒蛇和熊猫很陌生。到目前为止,我试图在论坛上找到答案,但没有成功

我的问题如下:

  • 我从excel导入了一个数据框,其中有两列包含参数描述(字符串),包含周数据的可变列数(4到5列,取决于一个月的周数;01.mm.yyyy到(比如)28.mm.yyyy)以及包含月数据的列
  • 我需要将每月数据的前2个字符重命名为(因此,从第6列或第7列开始),列名称字符串从01重命名为(比如)25
例如:

可乐 可乐 第1-4周 01.01.2021 01.02.2021 ... 1111 2222 .......... .......... .......... ... 我需要将列名字符串的前两个字符从01重命名为(比如)25

您可以使用:

(上面的x设置为“列”轴的每个名称;名称更改为结果值)

以下是一个变体,它仅替换以下位置的
m3\u idx
th列中的名称:

df.rename(columns = lambda x, idx=iter(range(df.columns.size)):
                        x if next(idx) < m3_idx else x[:2].replace("01", "25")+x[2:],
          inplace=True)
df.rename(columns=lambda x,idx=iter(range(df.columns.size)):
如果下一个(idx)
此错误是由于赋值的左侧
df.columns[m3_idx::]=…
(右侧起作用)-我们无法赋值给切片。因此,为了实现这一点,我们可以构造整个列索引并将其分配给
df.columns

df.columns = pd.Index.union(df.columns[:m3_idx],
                            df.columns[m3_idx:].str.replace("^01", "25", regex=True),
                            sort=False)

您可以尝试
df.columns=df.columns[:m3_idx].tolist()+df.columns[m3_idx:].str.replace(“^01”、“25”).tolist()
@ShubhamSharma:现在尝试过,但仍然得到相同的错误。看起来,df.columns无法接受列范围的一部分作为要处理的切片。这似乎是可行的-但不幸的是,如果每月范围之前的某些列标题包含01-它们也会被替换。因此,我试图获得一部分列,但不是所有列。当你说包含01时,你的意思是从01开始,对吗我很快就会有另一个答案。是的,的确如此。例如,如果4月份的一周为2021年4月1日,则上述代码也将替换为25。因此,接下来的几周将是:25.04.2021、08.04.2021、15.05.2021。为了完整起见,我添加了一个带有
rename()
的变体。太棒了-现在我有两个变体可供选择:)太棒了!它起作用了!谢谢!出于好奇-regex参数是什么意思?我注意到一个
未来警告:在未来的版本中,regex的默认值将从True更改为False。
regex=True
确保发生此更改时,
“^01”
将继续被解释为regex。
Exception has occurred: TypeError
Index does not support mutable operations
df.columns = pd.Index.union(df.columns[:m3_idx],
                            df.columns[m3_idx:].str.replace("^01", "25", regex=True),
                            sort=False)