删除数据框括号中的内容

时间:2016-07-25 07:14:32

标签: python pandas dataframe

我正在尝试使用以下代码删除数据框中所有列的括号内的所有内容。但我无法正确地做到这一点。任何帮助都非常感谢

def clean_text(data):
     if data.find('(')!=-1:
         st=data[data.find("(") + 1:data.find(")")])
         data.replace(st,'')  # cant use this
     return data.lower()


no_dup_cols = no_dup.columns.values
for col in no_dup_cols:
    no_dup[col] = no_dup[col].apply(clean_text)

4 个答案:

答案 0 :(得分:4)

使用循环列和replace的解决方案:

import pandas as pd

data = pd.DataFrame({'A':['(1)','2','3'],
                   'B':['(B) 77','s gg','d'],
                   'C':['s','(d) 44','f']})

print (data)
     A       B       C
0  (1)  (B) 77       s
1    2    s gg  (d) 44
2    3       d       f

for col in data:
    data[col] = data[col].str.replace(r'\(.*\)', '')
print (data)
   A     B    C
0       77    s
1  2  s gg   44
2  3     d    f

列表推导和concat的解决方案:

data = pd.concat([data[col].str.replace(r'\(.*\)', '') for col in data], axis=1)
print (data)
   A     B    C
0       77    s
1  2  s gg   44
2  3     d    f

答案 1 :(得分:3)

我将整个事物堆叠成pd.Series

sk = range(df.columns.nlevels)

df = df.stack(sk)

然后执行str.replace

df = df.str.replace(r'\(.*\)', '')

然后取消堆叠

uk = [i * -1 - 1 for i in sk]

df = df.unstack(uk)

一共有一个很好的功能

def df_replace(df, *args, **kwargs):
    sk = range(df.columns.nlevels)
    uk = [i * -1 - 1 for i in sk]

    return df.stack(sk).astype(str).str.replace(*args, **kwargs).unstack(uk)

str.replace

一样使用它
df_replace(df, r'\(.*\)', '')

时序

结论是我的解决方案看起来很聪明但有点慢......换句话说,jezrael的解决方案更快。

<强>码

data = pd.DataFrame({'A':['(1)','2','3'],
                   'B':['(B) 77','s gg','d'],
                   'C':['s','(d) 44','f']})

def jez1(data):
    data = data.copy()
    for col in data:
        data[col] = data[col].str.replace(r'\(.*\)', '')
    return data

def jez2(data):
    return pd.concat([data[col].str.replace(r'\(.*\)', '') for col in data], axis=1)

def pir(data):
    return df_replace(data, r'\(.*\)', '')

enter image description here

答案 2 :(得分:0)

我对熊猫并不熟悉,但如果数据是字符串类型,那么你应该做的事情

data = data.replace(st, '')

而不是

data.replace(st,'')

比照https://docs.python.org/2/library/string.html#string.replace

是否可以提供数据样本以及您希望得到的更精确的示例? :)

答案 3 :(得分:0)

data[col] = data[col].str.replace(r'\(.*\)', '')