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

时间:2019-04-14 19:49:20

标签: 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']

输出:

     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

所需的输出:

       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

5 个答案:

答案 0 :(得分:5)

使用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')

为避免评论中突出显示的问题,

  

如果任何列名以_或_开头或结尾,请注意strip()   x超出后缀。

您可以使用str.replace

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

df.columns
# Index(['W', 'First', 'Last', 'Slice'], dtype='object')

答案 1 :(得分:4)

df.columns = [col[:-2] for col in df.columns if col[-2:]=='_x' else col]

df.columns = [col.replace('_x', '') for col in df.columns]

答案 2 :(得分:1)

我建议使用rename函数:

setAttribute()

输出是所需的

根据Quang Hoang的解决方案,您还可以照顾FabienP的评论并进行修改:

df.rename(columns = lambda x: x.strip('_x'))

提供所需的输出。

另一个解决方案很简单:

df.rename(columns = lambda x: x.replace('_x$', ''))

答案 3 :(得分:1)

我通常使用@ 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

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

pd.drop_prefix('myprefix_')

答案 4 :(得分:0)

在 Python 3.9+ 中,您可以使用字符串方法 removesuffix()removeprefix(),如下所示:

df.columns = df.rename(columns = lambda x: x.removesuffix('_x')) # or any suffix per say
df.columns = df.rename(columns = lambda x: x.removeprefix('prefix_i_want_to_remove')) 

或者你可以直接映射到列上:

df.columns = df.columns.map(lambda x: x.removesuffix('_x')) # or any suffix per say
df.columns = df.columns.map(lambda x: x.removeprefix('prefix_i_want_to_remove'))