我有两个资料框:
研究人员:所有研究人员及其 id_number 的串列
样本:样本串列和所有与之相关的研究人员,同一个单元格中可能有多个研究人员。
我想查看研究表中的每一行,并检查它们是否出现在表样本的每一行中。如果他们这样做,我想得到:a) 他们从研究人员表中得到的 id 和从样本表中得到的样本编号。
表研究员
id_researcher full_name
0 1 Jack Sparrow
1 2 Demi moore
2 3 Bickman
3 4 Charles Darwin
4 5 H. Haffer
表样
sample_number collector
230 INPA A 231 Haffer
231 INPA A 232 Charles Darwin
232 INPA A 233 NaN
233 INPA A 234 NaN
234 INPA A 235 Jack Sparrow; Demi Moore ; Bickman
我想要的输出:
id_researcher num_samples
0 5 INPA A 231
1 4 INPA A 232
2 1 INPA A 235
3 2 INPA A 235
4 3 INPA A 235
我可以使用以下代码在常规 python 中使用回圈来实作它,但它非常低而且很长。有谁知道更快更简单的方法?也许与熊猫适用?
id_researcher = []
id_num_sample = []
for c in range(len(data_researcher)):
for a in range(len(data_samples)):
if pd.isna(data_samples['collector'].iloc[a]) == False and data_researcher['full_name'].iloc[c] in data_samples['collector'].iloc[a]:
id_researcher.append(data_researcher['id_researcher'].iloc[c])
id_num_sample.append(data_samples['No TEC'].iloc[a])
data_researcher_sample = pd.DataFrame.from_dict({'id_pesq': id_researcher, 'num_sample': id_num_sample}).sort_values(by='num_amostra')
uj5u.com热心网友回复:
你有几个资料清理作业,以小写做这样的“摩尔定律”,“Haffer”在一种情况下名字的首字母,没有在其它等标准化你的两个dataframes后,您可以split
与explode
collections
和使用merge
:
samples['collector'] = samples['collector'].str.split(';')
samples = samples.explode('collector')
samples['collector'] = samples['collector'].str.strip()
out = researchers.merge(samples, right_on='collector', left_on='full_name', how='left')[['id_researcher','sample_number']].sort_values(by='sample_number').reset_index(drop=True)
输出:
id_researcher sample_number
0 5 INPA A 231
1 4 INPA A 232
2 1 INPA A 235
3 2 INPA A 235
4 3 INPA A 235
0 评论