Python 如何删除dataframe列中字符后的字符串的其余部分?
我有一个包含userdata的数据框。有一列包含用户已访问的文件名。文件名如下所示:Python 如何删除dataframe列中字符后的字符串的其余部分?,python,regex,pandas,Python,Regex,Pandas,我有一个包含userdata的数据框。有一列包含用户已访问的文件名。文件名如下所示: blah-blah-blah/dss_outline.pdf doot-doot/helper_doc.pdf blah-blah-blah/help_file.pdf 我的目标是删去后面的所有内容,包括/这样我就可以只看人们正在检查的顶级程序(许多不同的文件都是在这些程序下组织的) 因此,我面临两个挑战: 1-如何“抓取”到“/”的所有内容?我一直在看正则表达式,但是我很难写出正确的表达式 2-如何用连
blah-blah-blah/dss_outline.pdf
doot-doot/helper_doc.pdf
blah-blah-blah/help_file.pdf
我的目标是删去后面的所有内容,包括/这样我就可以只看人们正在检查的顶级程序(许多不同的文件都是在这些程序下组织的)
因此,我面临两个挑战:
1-如何“抓取”到“/”的所有内容?我一直在看正则表达式,但是我很难写出正确的表达式
2-如何用连接的文件名替换所有文件名?我发现我可以使用
df['Filename']=df['Filename'].str.split('/')[0]
获取适当的部分,但它不会应用于整个series对象。这是我想做的逻辑,但我不知道怎么做
谢谢使用
df。更换
df.replace('\/.*$','',regex=True)
col
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
您可以使用\/.*$
匹配不需要的零件并将其删除:
这将匹配正斜杠和任何后续字符,直到字符串的结尾(如果引擎需要,请小心使用多行标志!)
或者您可以使用^[^/]+
匹配所需的零件并提取它:
这将匹配字符串开头的任何连续字符,除了/
(同样,需要多行!)。使用系列。apply()
:
代码:
您手边有很多解决方案:
1) 只需使用split()
方法:
名称:col1,数据类型:object
2) 您可以使用apply()
+split()
3) 您可以使用rsplit()
4) 您可以将本机正则表达式与extract()
一起使用:
“但它不会适用于整个系列对象”的意思是什么?你能再解释一下吗df['your_column_name']=df['your_column_name'].map(lambda:os.path.basename(a))
取决于您的文件夹结构,如下所示,您也可以使用str.split()
如何在数据帧中的列中应用它?那么,假设我使用re.sub()将不需要的位替换为一个空字符串,我如何逐行应用该位?我想,您必须迭代这些行并逐个应用它。这太棒了,感谢您在这里分享众多选项!我仍然在学习pandas/regex/lambda表达式,所以很高兴看到它们都在这里出现。@RNGeezy,thnx感谢您喜欢并接受这个答案,快乐学习:-)
>>> import pandas
>>> data = {'filename': ["blah-blah-blah/dss_outline.pdf", "doot-doot/helper_doc.pdf", "blah-blah-blah/help_file.pdf"]}
>>> df = pandas.DataFrame(data=data)
>>> df
filename
0 blah-blah-blah/dss_outline.pdf
1 doot-doot/helper_doc.pdf
2 blah-blah-blah/help_file.pdf
>>> def get_top_level_from(string):
... return string.split('/')[0]
...
>>> series = df["filename"]
>>> series
0 blah-blah-blah/dss_outline.pdf
1 doot-doot/helper_doc.pdf
2 blah-blah-blah/help_file.pdf
Name: filename, dtype: object
>>> series.apply(get_top_level_from)
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
Name: filename, dtype: object
def get_top_level_from(string):
return string.split('/')[0]
results = df["filename"].apply(get_top_level_from)
>>> df
col1
0 blah-blah-blah/dss_outline.pdf
1 doot-doot/helper_doc.pdf
2 blah-blah-blah/help_file.pdf
>>> df['col1'].str.split('/', 1).str[0].str.strip()
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
>>> df['col1'].apply(lambda s: s.split('/')[0])
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
Name: col1, dtype: object
>>> df['col1'].str.rsplit('/').str[0]
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
Name: col1, dtype: object
>>> df['col1'] = df['col1'].str.extract('([^/]+)')
>>> df
col1
0 blah-blah-blah
1 doot-doot
2 blah-blah-blah
OR
# df.col1.str.extract('([^/]+)')