从pandas的列标题中删除前缀(或后缀)子字符串

use*_*511 4 python pandas

我正在尝试删除位于df列名称部分结尾的子字符串_x。

样本df代码:

import pandas as pd

d = {'W_x': ['abcde','abcde','abcde']}
df = pd.DataFrame(data=d)

df['First_x']=[0,0,0]
df['Last_x']=[1,2,3]
df['Slice']=['abFC=0.01#%sdadf','12fdak*4%FC=-0.035faf,dd43','FC=0.5fasff']
Run Code Online (Sandbox Code Playgroud)

输出:

     W_x  First_x Last_x                 Slice
0  abcde      0     1                   abFC=0.01
1  abcde      0     2  12fdak*4%FC=-0.035faf,dd43
2  abcde      0     3                 FC=0.5fasff
Run Code Online (Sandbox Code Playgroud)

所需的输出:

       W  First  Last                       Slice
0  abcde      0     1                   abFC=0.01
1  abcde      0     2  12fdak*4%FC=-0.035faf,dd43
2  abcde      0     3                 FC=0.5fasff
Run Code Online (Sandbox Code Playgroud)

Qui*_*2k1 14

我建议使用该rename功能:

df.rename(columns = lambda x: x.strip('_x'))
Run Code Online (Sandbox Code Playgroud)

输出符合要求

您还可以根据 Quang Hoang 的解决方案处理 FabienP 的评论和修改:

df.rename(columns = lambda x: x.replace('_x$', ''))
Run Code Online (Sandbox Code Playgroud)

给出所需的输出。

另一种解决方案很简单:

df.rename(columns = lambda x: x[:-2] if x.endswith('_x') else x)
Run Code Online (Sandbox Code Playgroud)

  • 谨防!如果列的名称在开始或结束时包含“_”或“x”,超出后缀“_x”,则可能会导致问题... (3认同)

cs9*_*s95 10

使用str.strip/ rstrip

# df.columns = df.columns.str.strip('_x')
# Or, 
df.columns = df.columns.str.rstrip('_x')  # strip suffix at the right end only.

df.columns
# Index(['W', 'First', 'Last', 'Slice'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

为了避免注释中突出显示的问题:

如果任何列名以后缀_或x开头或结尾,请当心strip()。

您可以使用str.replace

df.columns = df.columns.str.replace(r'_x$', '')

df.columns
# Index(['W', 'First', 'Last', 'Slice'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

  • 与另一个答案相同,如果任何列名以“_”或“x”开头或结尾超出后缀,请注意“strip()”。 (3认同)

dmo*_*ner 8

我通常使用 @cs95 方式,但为了方便起见,将其包装在数据框方法中:

import pandas as pd

def drop_prefix(self, prefix):
    self.columns = self.columns.str.lstrip(prefix)
    return self

pd.core.frame.DataFrame.drop_prefix = drop_prefix

Run Code Online (Sandbox Code Playgroud)

然后您可以将其与已在 pandas 中实现的逆方法一起使用add_prefix

pd.drop_prefix('myprefix_')
Run Code Online (Sandbox Code Playgroud)

  • 像这样使用 lstrip 可能会删除一些字符,例如“myprefix_mean”.lstrip('myprefix_') 将返回“an”而不是可能预期的“mean”。正如其他评论中建议的那样,在这种情况下替换可能会更好。 (6认同)

Qua*_*ang 7

df.columns = [col[:-2] for col in df.columns if col[-2:]=='_x' else col]
Run Code Online (Sandbox Code Playgroud)

要么

df.columns = [col.replace('_x', '') for col in df.columns]
Run Code Online (Sandbox Code Playgroud)

  • 第二种方法将替换每次出现,即使列名 'Last_xmas_x` 将是 `Lastmas` (2认同)