Python / Pandas: 根据condition/index重命名DataFrame中的几个列名
Python / Pandas: Renaming several column names in DataFrame based on condition/index
我对 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
如何处理列索引以指定要更改 headers 的列范围?
EDIT:想法是更改 headers 仅列范围的一部分,因为每月数据列之前的一些“每周数据”列可能会开始相同的字符串“01”,不可更改
I need to rename first 2 characters of the column name string from 01 to (say) 25
您可以使用 pandas.DataFrame.rename
:
df = df.rename(lambda x: x[:2].replace("01", "25")+x[2:], axis="columns")
(上面的x设置为“列”轴的每个名称;名称更改为结果值)。
这是一个仅替换第 m3_idx
列中的名称的变体:
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)
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)
我对 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
如何处理列索引以指定要更改 headers 的列范围?
EDIT:想法是更改 headers 仅列范围的一部分,因为每月数据列之前的一些“每周数据”列可能会开始相同的字符串“01”,不可更改
I need to rename first 2 characters of the column name string from 01 to (say) 25
您可以使用 pandas.DataFrame.rename
:
df = df.rename(lambda x: x[:2].replace("01", "25")+x[2:], axis="columns")
(上面的x设置为“列”轴的每个名称;名称更改为结果值)。
这是一个仅替换第 m3_idx
列中的名称的变体:
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)
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)