繁体   English   中英

如何从 Python DataFrame 列中的字符串中删除不需要的部分

[英]How do I remove unwanted parts from strings in a Python DataFrame column

基于最初由 u/commandlineluser 在 reddit 上建议的脚本,我(作为 Python 新手)试图修改原始代码以删除因列值而异的不需要的部分。 Python 脚本涉及创建一个包含键和值的字典,并使用带有 str.replace 的列表理解。

(reddit 上 u/commandlineluser 的原始脚本的一部分)

extensions = "dat", "ssp", "dta", "v9", "xlsx"

(下一行是我对上面部分的修改,下面是完整的代码块)

extensions = "dat", "ssp", "dta", "20dta", "u20dta", "f1dta", "f2dta", "v9", "xlsx"

有些结果与我想要的不同。 请看下面(我试过的)。

import pandas as pd
import re
data = {"full_url": ['https://meps.ahrq.gov/data_files/pufs/h225/h225dat.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h51bdat.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h47f1dat.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h225/h225ssp.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h220i/h220if1dta.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h220h/h220hv9.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h220e/h220exlsx.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h224/h224xlsx.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h036brr/h36brr20dta.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h036/h36u20dta.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h197i/h197if1dta.zip',
                     'https://meps.ahrq.gov/data_files/pufs/h197i/h197if2dta.zip']}
df = pd.DataFrame(data)
extensions = ["dat", "ssp", "dta", "20dta", "u20dta", "f1dta", "f2dta", "v9", "xlsx"]
replacements = dict.fromkeys((f"{ext}[.]zip$" for ext in extensions), "")
df["file_id"] = df["full_url"].str.split("/").str[-1].replace(replacements, regex=True)
print(df["file_id"])

注释output

0         h225 (looks good)
1         h51b (looks good)
2        h47f1 (h47 -> desired)
3         h225 (looks good)
4      h220if1 (h220i -> desired)
5        h220h  (looks good)
6        h220e  (looks good)
7         h224 (looks good)
8     h36brr20 (h36brr -> desired)
9       h36u20 (h36 -> desired)
10     h197if1 (h197i -> desired)
11     h197if2 (h197i -> desired)

您在这里有两个问题,它们都在这一行中:

extensions = ["dat", "ssp", "dta", "20dta", "u20dta", "f1dta", "f2dta", "v9", "xlsx"]

首要问题

第一个问题是按此列表的元素顺序排列。 "dat""dta"是这个字符串中其他元素的子串,它们位于这个列表的前面。 举个例子: h47f1dat.zip需要变成h47 但是在这些行中:

replacements = dict.fromkeys((f"{ext}[.]zip$" for ext in extensions), "")
df["file_id"] = df["full_url"].str.split("/").str[-1].replace(replacements, regex=True)

您保持顺序,这意味着您将首先使用"dat"字符串进行过滤,该字符串变为h47f1 这可以通过重新排序列表轻松解决。

第二期

您错过了extensions列表中的一个条目:如果您希望h47f1dat.zip成为h47 ,您需要在列表中包含"f1dat"但您只有"f1dta"

结论

你快到了。 只是元素的顺序有一个小问题,缺少一个扩展名(或者您的 URL 中有错字)。

以下扩展列表:

extensions = ["ssp", "20dta", "u20dta", "f1dat", "f1dta", "f2dta", "v9", "dat", "dta", "xlsx"]

与代码的 rest 一起为您提供所需的结果:

0       h225                                                                                                                                                                                                                                                                    
1       h51b                                                                                                                                                                                                                                                                    
2        h47                                                                                                                                                                                                                                                                    
3       h225                                                                                                                                                                                                                                                                    
4      h220i                                                                                                                                                                                                                                                                    
5      h220h                                                                                                                                                                                                                                                                    
6      h220e                                                                                                                                                                                                                                                                    
7       h224                                                                                                                                                                                                                                                                    
8     h36brr                                                                                                                                                                                                                                                                    
9       h36u                                                                                                                                                                                                                                                                    
10     h197i                                                                                                                                                                                                                                                                    
11     h197i

很好地了解了元素顺序和缺少扩展名的问题。 谢谢你。

问题 1:您的意思是列表扩展名未按字母顺序排序? 可以不使用Python sort()方法对列表进行排序吗? 我在实际的 dataframe 中有超过一千行,我更喜欢以编程方式对列表进行排序。 我希望我没有误解你的评论。

问题 2:我不明白为什么我在 output 中得到h36u而不是所需的值h36 ,即使在按照您的建议重新排序列表之后也是如此。 有什么想法吗?

我尝试了另一种使用 Jupyter Lab 的方法(下面的代码),它提供了 output ,其中前两个值与所需的 output 不同(如下所示),但其他值似乎是我想要的,包括h36

df["file_id"] = df["full_url"].str.split("/").str[-1].str.replace(r'(\dat.zip \
|f1dat.zip|dta.zip|f1dta.zip|f2dta.zip|20dta.zip|u20dta.zip|xlsx.zip|v9.zip|ssp.zip)' \
,'', regex=True)
print(df["file_id"])

Output(注)

0     h225dat.zip (not desired; h225 desired)
1     h51bdat.zipn (not desired; h51b desired)
2             h47
3            h225
4           h220i
5           h220h
6           h220e
7            h224
8          h36brr
9             h36
10          h197i
11          h197i

问题 3:对上述替代代码片段有何评论?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM