我正在尝试使用以下代码删除数据框中所有列的括号内的所有内容。但我无法正确地做到这一点。任何帮助都非常感谢
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)
答案 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'\(.*\)', '')
答案 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'\(.*\)', '')