【问题标题】:Python / Pandas: Renaming several column names in DataFrame based on condition/indexPython / Pandas:根据条件/索引重命名DataFrame中的几个列名
【发布时间】:2021-05-23 19:15:30
【问题描述】:

我对 Python 和 Pandas 很陌生。到目前为止尝试在论坛上找到答案,但没有成功。

我的问题如下:

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

例如:

Col1 Col2 Wk 1- Wk 4 01.01.2021 01.02.2021 ...
1111 2222 .......... .......... .......... ...

我想得到以下:

Col1 Col2 Wk 1- Wk 4 25.01.2021 25.02.2021 ...
1111 2222 .......... .......... .......... ...

我尝试通过使用 df.columns 处理列索引范围来解决它,如下代码:

df.columns[m3_idx:] = df.columns[m3_idx:].str.replace("^01", "25")

其中m3_idx 是列的索引,重命名应该从这里开始。但我得到一个 TypeError:

Exception has occurred: TypeError
Index does not support mutable operations

如何处理列索引以指定要更改标题的列范围?

编辑:想法是仅更改列范围的一部分的标题,因为每月数据之前的某些“每周数据”列可能以相同的字符串“01”开头,这不能改变

【问题讨论】:

  • 你可以试试df.columns = df.columns[:m3_idx].tolist() + df.columns[m3_idx:].str.replace('^01', '25').tolist()
  • @ShubhamSharma:现在试过了,仍然出现同样的错误。看来,df.columns 不能接受列范围的一部分作为要处理的切片。

标签: python-3.x pandas rename


【解决方案1】:

我需要将列名字符串的前 2 个字符从 01 重命名为(比如说)25

你可以使用pandas.DataFrame.rename:

df = df.rename(lambda x: x[:2].replace("01", "25")+x[2:], axis="columns")    

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

这是一个仅替换 m3_idxth 列中的名称的变体:

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)

【讨论】:

  • 它似乎工作 - 但不幸的是,如果每月范围之前的某些列标题包含 01 - 它们也会被替换。因此,我试图获取列的一部分,但不是全部。
  • 当您说包含01时,您的意思是从01开始,对吗? - 我很快就会有另一个答案。
  • 是的,确实如此。如果例如4 月的那一周是 01.04.2021,上面的代码也将把这个替换为 25。因此,这些周将如下所示:25.04.2021、08.04.2021、15.05.2021。
  • 为了完整起见,我添加了一个带有rename()的变体。
  • 太棒了 - 现在我有两种变体可供选择:)
【解决方案2】:
Exception has occurred: TypeError
Index does not support mutable operations

此错误是由于分配 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)

【讨论】:

  • 太棒了!有用!非常感谢!只是出于好奇 - 正则表达式参数是什么意思?
  • 我注意到FutureWarning: The default value of regex will change from True to False in a future version. regex=True 保证"^01" 在发生这种变化时将继续被解释为正则表达式。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 2019-09-26
  • 2019-07-21
  • 2016-02-28
  • 2021-04-24
  • 2020-07-05
相关资源
最近更新 更多