我有一个df,它包含包含多个数据的字符串,我希望解析这些数据并将其存储为字典。我想将PubMed Identifier
存储为pmid
键,以下数字存储为其值,Embase
存储为euid
和以下数字,NCT
存储为trialid
和下面的数字(无空格),并忽略其上的数字或忽略PubMed Identifier/Embase
而不跟踪/关联数字。
data = {"ORN": [1, 2, 3, 4],
"EN": ["PubMed Identifier 27955689", "PubMed Identifier 8010359Embase 24208639", "PubMed Identifier 12237786Embase 35148801", "PubMed Identifier NCT02360007 12537613"]
}
df = pd.DataFrame(data=data)
ORN EN
0 1 PubMed Identifier 27955689
1 2 PubMed Identifier 8010359Embase 24208639
2 3 PubMed Identifier 12237786Embase 35148801
3 4 PubMed Identifier NCT02360007 12537613
desired_df
ORN EN
0 1 {"pmid": 27955689}
1 2 {"pmid": 8010359, "euid": 24208639}
2 3 {"pmid": 12237786, "euid": 35148801}
3 4 {"trialid": 02360007}
我不明白我该怎么做wrt最好的方法。我的想法是用.split(expand=True)
将字符串拆分成列,然后对列进行重新排序,然后使用to_dict()
进行合并,这是我能想到的最好的方法,但任何更好的建议都会很好。字符串操作是我需要改进的东西。
发布于 2021-08-20 09:47:49
创建映射字典,然后构造正则表达式模式,以查找每一行中的所有键值对,然后将键值对重新映射为dict。
d = {'PubMed Identifier': 'pmid',
'Embase': 'emid', 'NCT': 'trialid'}
pat = fr'({"|".join(d)})\s*(\d+)'
df['EN'].str.findall(pat).map(lambda l: {d[k]: v for k, v in l})
0 {'pmid': '27955689'}
1 {'pmid': '8010359', 'emid': '24208639'}
2 {'pmid': '12237786', 'emid': '35148801'}
3 {'trialid': '02360007'}
Name: EN, dtype: object
发布于 2021-08-20 10:24:36
用.str.extract()
提取数据
用.apply()
+ dropna()
+ to_dict()
构建dict
使用.str.extract()
提取数据的
df_extract = df['EN'].str.extract(r'PubMed Identifier\s*(?:(?P<pmid>\d+)(?:Embase\s*(?P<euid>\d+))?)|NCT(?P<trialid>\d+)')
或者,使用:
df_extract = df['EN'].str.extract(r'PubMed Identifier\s*(?P<pmid>\d+)?\s*(?:Embase\s*(?P<euid>\d+))?(?:NCT\s*(?P<trialid>\d+))?')
结果:
print(df_extract)
pmid euid trialid
0 27955689 NaN NaN
1 8010359 24208639 NaN
2 12237786 35148801 NaN
3 NaN NaN 02360007
用to_dict()
+ .apply()
+ dropna()
构建dict
df_extract.apply(lambda x: x.dropna().to_dict(), axis=1)
结果:
0 {'pmid': '27955689'}
1 {'pmid': '8010359', 'euid': '24208639'}
2 {'pmid': '12237786', 'euid': '35148801'}
3 {'trialid': '02360007'}
dtype: object
发布于 2021-08-20 09:24:38
您可以使用str.extract
df['EN'].str.extract('PubMed Identifier +(?P<pmid>\d+)|NCT(?P<trialid>\d+)|Embase +(?P<euid>[^ ]+)')
产出:
pmid trialid euid
0 27955689 NaN NaN
1 8010359 NaN NaN
2 12237786 NaN NaN
3 NaN 02360007 NaN
若要拥有as dict,请添加.T.to_dict()
df['EN'].str.extract('(?=PubMed Identifier\s+(?P<pmid>[^ ]+\d+))?|(?=Embase\s+(?P<euid>\d+))?').T.to_dict()
产出:
{0: {'pmid': '27955689', 'euid': nan},
1: {'pmid': '8010359', 'euid': nan},
2: {'pmid': '12237786', 'euid': nan},
3: {'pmid': 'NCT02360007', 'euid': nan}}
https://stackoverflow.com/questions/68865787
复制相似问题