如何删除数据帧列中字符后面的字符串的其余部分?

2024-03-28 14:31:58 发布

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

我有一个包含用户数据的数据帧。有一列包含用户访问过的文件名。文件名如下所示:

blah-blah-blah/dss_outline.pdf  
doot-doot/helper_doc.pdf
blah-blah-blah/help_file.pdf

我的目标是去掉后面的所有内容,包括/这样我就可以查看人们正在检查的顶级程序(许多不同的文件都是在这些程序下组织的)。你知道吗

所以,我面临两个挑战:

1-如何“抓住”到“/”的所有东西?我一直在看regex,但是我很难写出正确的表达式。你知道吗

2-如何用连接的文件名替换所有文件名?我发现我可以使用df['Filename'] = df['Filename'].str.split('/')[0]来获取适当的部分,但它不会应用于series对象。这就是我想做的逻辑,但我不知道怎么做。你知道吗

谢谢


Tags: 数据用户程序helperdfdocpdf文件名
3条回答

你手头有很多解决方案:

1) 仅使用split()方法:

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

名称:col1,数据类型:object

2) 您可以使用apply()+split()

>>> df['col1'].apply(lambda s: s.split('/')[0])
0    blah-blah-blah
1         doot-doot
2    blah-blah-blah
Name: col1, dtype: object

3) 您可以使用rsplit()+str[0]去除所需的:

>>> df['col1'].str.rsplit('/').str[0]
0    blah-blah-blah
1         doot-doot
2    blah-blah-blah
Name: col1, dtype: object

4) 您可以将本机正则表达式与extract()一起使用:

>>> df['col1'] = df['col1'].str.extract('([^/]+)')
>>> df
             col1
0  blah-blah-blah
1       doot-doot
2  blah-blah-blah

OR
# df.col1.str.extract('([^/]+)')

您可以使用\/.*$匹配不需要的部分并将其删除:DEMO
这将匹配一个正斜杠和后面的任何字符,直到字符串的结尾(如果引擎需要,请小心使用多行标志!)。你知道吗

或者您可以使用^[^/]+匹配所需的部分并提取它:DEMO
它匹配字符串开头的/以外的任何连续字符(同样,需要多行!)。你知道吗

使用series.apply()

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

相关问题 更多 >