Python 如何删除dataframe列中字符后的字符串的其余部分?

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-如何用连

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

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('([^/]+)')