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

bxjv4tth  于 2023-04-28  发布在  其他
关注(0)|答案(7)|浏览(223)

我试图删除位于我的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
4ngedf3f

4ngedf3f1#

python〈3.9,pandas〈1.4

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

为了避免评论中强调的问题:
如果任何列名的后缀以_或x开头或结尾,请注意strip()。
你可以用str.replace

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

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

更新:python〉= 3.9,pandas〉= 1.4

从1.4版开始,您很快就可以使用str.removeprefix/str.removesuffix
示例:

s = pd.Series(["str_foo", "str_bar", "no_prefix"])
s
0    str_foo
1    str_bar
2    no_prefix
dtype: object

s.str.removeprefix("str_")
0    foo
1    bar
2    no_prefix
dtype: object
s = pd.Series(["foo_str", "bar_str", "no_suffix"])
s
0    foo_str
1    bar_str
2    no_suffix
dtype: object

s.str.removesuffix("_str")
0    foo
1    bar
2    no_suffix
dtype: object
wfveoks0

wfveoks02#

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]
guz6ccqo

guz6ccqo3#

我建议使用rename函数:

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

输出符合要求
你自己也可以照顾FabienP的评论和修改,如果根据Quang Hoang的解决方案:

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

给出所需的输出。
另一个解决方案很简单:

df.rename(columns = lambda x: x[:-2] if x.endswith('_x') else x)
cedebl8k

cedebl8k4#

我通常使用@cs95方式,但为了方便起见,我将其 Package 在 Dataframe 方法中:

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

然后你可以像pandas add_prefix中已经实现的inverse方法一样使用它:

pd.drop_prefix('myprefix_')
ocebsuys

ocebsuys5#

Python=3.8,Pandas=1.3:

使用df.columns = df.columns.str.replace('_x','')去掉后缀。
这样做效果很好,只从列名中删除确切的子字符串(后缀)'_x',而不是str.strip/str.rstrip(substring),它从DataFrame的列名中删除substring中提到的所有字符,而不管列名中是否存在完整的子字符串,这些字符出现的顺序等。

2hh7jdfx

2hh7jdfx6#

在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'))

或者,您可以直接Map到列,如下所示:

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'))
wgx48brx

wgx48brx7#

我有一个类似的请求,需要去掉列标题的前缀。在我的例子中,前缀有这样的模式:* *'p1-','p2-','p3-'**等等,所以我使用下面的代码片段来删除它们:

df.columns.str.replace(r'[a-z][0-9]*-','')

相关问题