【问题标题】:Pandas If duplicate on same row, lookup value from another dataframePandas 如果在同一行重复,则从另一个数据框中查找值
【发布时间】:2022-12-15 13:29:21
【问题描述】:

我想到了这种情况,但我不知道该怎么做。

changeme 列中的值等于df1 同一行上lookforme 列中的值时,我想在df2matchme 列中查找该值,获取相应的@ 987654326@ 值并在df1 上覆盖changeme 中的值。

如果在 df2 上多次出现 lookforme,则只匹配第一个。

我尝试了几种方法,但无济于事,抱怨说当我尝试分解时数据帧不均匀,等等。

          changeme       name   qty  lookforme
0          1296477  ItemName2  3.16    1296477
1            62328  ItemName1  7.94      62328
2           233201  ItemName3  5.56     233201
3      66074000105  ItemName4  6.88     233694

           matchme       grabme
0            62328  35422028768
1           162592  62673001137
2           163200  15422029895
3           164123  45492029154
4           166596  35422031737
5           232264  75372043938
6           232267  95462043655
7           233201  35422044775
8           233201  24613628530
9           233226  35412044812
10          233694  66074000105
11          235466  35422042863
12          272021  85422052947
13          272691  35422053340
14          272872  27536196938
15          273729  39456023149
16          284848  27536197195
17          284861  62672008054
18         1296477  35421853202
19         1296477  75841596436
20         2296518  97630194508

预期结果:

          changeme       name   qty  lookforme
0      35421853202  ItemName2  3.16    1296477
1      35422028768  ItemName1  7.94      62328
2      35422044775  ItemName3  5.56     233201
3      66074000105  ItemName4  6.88     233694

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-loc


    【解决方案1】:

    让我们尝试以下操作:

    过滤与df1 中的“changeme”匹配的“lookforme”值,并使用locdf2 的“matchme”值中找到这些值。由于某些“lookforme”值在df2 中多次出现,因此删除重复项并保留第一个。

    然后使用map更新df1中的“changeme”值:

    cond = df1['changeme'] == df1['lookforme']
    new_values = df2.drop_duplicates('matchme').loc[df2['matchme'].isin(df1.loc[cond, 'changeme'])]
    df1.loc[cond, 'changeme'] = df1.loc[cond, 'changeme'].map(new_values.set_index('matchme')['grabme'])
    

    输出:

          changeme       name   qty  lookforme
    0  35421853202  ItemName2  3.16    1296477
    1  35422028768  ItemName1  7.94      62328
    2  35422044775  ItemName3  5.56     233201
    3  66074000105  ItemName4  6.88     233694
    

    【讨论】:

      【解决方案2】:

      你也可以试试这个:

      res = pd.merge(df1, df2,
                     left_on='lookforme', 
                     right_on='matchme').drop_duplicates('lookforme').reset_index(drop=True)
      # you have duplicates in df2 so we should-^^^^^^^^^^^^^^^
      
      df1['changeme'] = res.apply(lambda x: x['grabme'] 
                                         if x['changeme']==x['lookforme'] 
                                         else x['changeme'], axis=1)
      print(df1)
      
                changeme       name   qty  lookforme
      0      35421853202  ItemName2  3.16    1296477
      1      35422028768  ItemName1  7.94      62328
      2      35422044775  ItemName3  5.56     233201
      3      66074000105  ItemName4  6.88     233694
      

      【讨论】:

      • 总是很高兴有其他选择,谢谢。
      • 临时评论:请注意,我更改了列标题以提高可读性。我尝试编辑您的答案以匹配,但建议的编辑队列已满。
      猜你喜欢
      • 1970-01-01
      • 2019-08-14
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2021-04-03
      • 2021-09-24
      相关资源
      最近更新 更多