【问题标题】:pandas: search column values from one df in another df column that contains listspandas:从一个 df 在另一个包含列表的 df 列中搜索列值
【发布时间】:2020-12-13 12:44:07
【问题描述】:

我需要将 df1['numsearch'] 列中的值搜索到 df2['Numbers'] 的列表中。如果数字在这些列表中,那么我想将 df2['Score'] 列中的值添加到 df1。请参阅下面的所需输出。

df1 = pd.DataFrame(
    {'Day':['M','Tu','W','Th','Fr','Sa','Su'],
     'numsearch':['1','20','14','99','19','6','101']
    })

df2 = pd.DataFrame(
    {'Letters':['a','b','c','d'],
     'Numbers':[['1','2','3','4'],['5','6','7','8'],['10','20','30','40'],['11','12','13','14']],
     'Score': ['1.1','2.2','3.3','4.4']})


desired output
  Day  numsearch            Score
0   M          1             1.1
1  Tu         20             3.3
2   W          4             4.4
3  Th         99          "No score"
4  Fr         19          "No score"
5  Sa          6             2.2 
6  Su        101          "No score"

我编写了一个处理测试数据的 for 循环。

scores = []
for s,ns in enumerate(ppr_data['SN']):
    match = ''
    for k,q in enumerate(jcr_data['All_ISSNs']):    
        if ns in q:
            scores.append(jcr_data['Journal Impact Factor'][k])
            match = 1
        else:
            continue
    if match == "":
        scores.append('No score')
        match = ""
df1['Score'] = np.array(scores)

在我的小测试中,但上面的代码可以工作,但是在处理较大的数据文件时,它会创建重复项。所以这显然不是最好的方法。

我敢肯定还有更适合 pandas 的代码行以 .fillna("No score") 结尾。

我尝试使用 loc 语句,但我一直在搜索包含列表的列中的一个数据框的值。

谁能解释一下?

【问题讨论】:

    标签: python-3.x pandas list dataframe


    【解决方案1】:
    df2=df2.explode('Numbers')#Explode df2 on Numbers
    d=dict(zip(df2.Numbers, df2.Score))#dict Numbers and Scores
    df1['Score']=df1.numsearch.map(d).fillna('No Score')#Map dict to df1 filling NaN with No Score
    

    可以这样缩短:

    df2=df2.explode('Numbers')#Explode df2 on Numbers
    df1['Score']=df1.numsearch.map(dict(zip(df2.Numbers, df2.Score))).fillna('No Score')
    
    
    
       Day numsearch     Score
    0   M         1       1.1
    1  Tu        20       3.3
    2   W        14       4.4
    3  Th        99  No Score
    4  Fr        19  No Score
    5  Sa         6       2.2
    6  Su       101  No Score
    

    【讨论】:

    • 谢谢。我忘记了“爆炸”。我曾经在另一种语言中使用此功能,但我从未想过。
    【解决方案2】:

    你可以试试left join和fillna:

    df1.merge(df2.explode('Numbers'), 
              left_on='numsearch', 
              right_on='Numbers', how='left')[['Day', 'numsearch', 'Score']].fillna("No score")
    

    输出:

      Day numsearch     Score
    0   M         1       1.1
    1  Tu        20       3.3
    2   W        14       4.4
    3  Th        99  No score
    4  Fr        19  No score
    5  Sa         6       2.2
    6  Su       101  No score
    

    【讨论】:

    • 感谢您的回答。像魅力一样工作。
    猜你喜欢
    • 2018-04-04
    • 2021-10-26
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2016-10-25
    • 2022-12-03
    • 2019-11-02
    • 2016-02-14
    相关资源
    最近更新 更多