拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 遍历资料框中的每一行,在第二个资料框中搜索此值,如果匹配,则从df1获取一个值,从df2获取另一个值

遍历资料框中的每一行,在第二个资料框中搜索此值,如果匹配,则从df1获取一个值,从df2获取另一个值

白鹭 - 2022-01-26 2111 0 0

我有两个资料框:

  1. 研究人员:所有研究人员及其 id_number 的串列

  2. 样本:样本串列和所有与之相关的研究人员,同一个单元格中可能有多个研究人员。

我想查看研究表中的每一行,并检查它们是否出现在表样本的每一行中。如果他们这样做,我想得到: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后,您可以splitexplode 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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *