根据不同的条件从数据帧中的列中删除某些部分

2024-09-27 17:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧:

 id         Name              New_Name
100263   Test Index (UHD)    Test Index
100264   Test Num             Test Num

正如您所看到的,当我的Name列中的值包含(时,我只想显示这个字符串的左边部分,例如:Test Index (UHD)->Test Index;但是,如果字符串不包含(,则需要整个字符串,例如:Test Num->Test Num

我有一个想法,我可以循环通过本列中的所有值来进行更改,例如,对于第一个值,我的想法是

try:
    pos=data.iloc[0,1].index('(')
except:
    pos=len(data.iloc[0,1])

New_Name =data.iloc[0,2][:pos]

我觉得不应该那么复杂,有什么简单的方法吗?谢谢


Tags: 数据字符串namepostestidnewdata
3条回答

这是一个具有简单regex的解决方案

regex = re.compile(r'.*?(\(.*?\))')
def strip_brackets(x):    
    result = re.findall(regex, x)
    for r in result:
        x = x.replace(r, '')
    return ' '.join(x.split())

df = pandas.DataFrame({'Name' : ['Test Index (UHD)', 'Test Num', 'More (foo) complicated (bar) case']})
df['NewName'] = df['Name'].apply(strip_brackets)
print(df)


                                Name                NewName
0                   Test Index (UHD)             Test Index
1                           Test Num               Test Num
2  More (foo) complicated (bar) case  More complicated case

假设您只有一个括号组件,您可以这样简化调用

data[ 'New_Name' ] = data.Name.apply( lambda s: s.split( '(', 1 )[ 0 ].strip() )

下面是一个删除括号下任何内容的一行代码:

df['New_Name'] = df['Name'].str.replace(r"\(.*\)","")

输出:

>>df

 id         Name              New_Name
100263   Test Index (UHD)    Test Index
100264   Test Num             Test Num

相关问题 更多 >

    热门问题