[英]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.