【问题标题】:Pandas dataframes - Match two columns in the two dataframes to change the value of a third columnPandas 数据框 - 匹配两个数据框中的两列以更改第三列的值
【发布时间】:2020-10-01 16:14:28
【问题描述】:

我有两个数据框 df1 和 df2。 df2 中的 x,y 值是 df1 中 x,y 值的子集。对于 df2 中的每个 x,y 行,我想将 df1 中的 knn 列的值更改为 0,其中 df2[x] = df1[x] 和 df2[y] = df1[y]。在下面的示例中,x,y 值 (1,1) 和 (1,2) 很常见,因此 df1 中的 knn 列将更改为 [0,0,0,0]。下面代码中的最后一行不起作用。如有任何指导,我将不胜感激。

import pandas as pd

df1_dict = {'x': ['1','1','1','1'],
        'y': [1,2,3,4],
        'knn': [1,1,0,0]
        }

df2_dict = {'x': ['1','1'],
        'y': [1,2]
        }

df1 = pd.DataFrame(df1_dict, columns = ['x', 'y','knn'])
df2 = pd.DataFrame(df2_dict, columns = ['x', 'y'])
df1['knn']= np.where((df1['x']==df2['x']) and df1['y']==df2['y'], 0)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以在这里使用merge

    u = df1.merge(df2,on=['x','y'],how='left',indicator=True)
    u = (u.assign(knn=np.where(u['_merge'].eq("both"),0,u['knn']))
         .reindex(columns=df1.columns))
    

    print(u)
    
       x  y  knn
    0  1  1    0
    1  1  2    0
    2  1  3    0
    3  1  4    0
    

    【讨论】:

    • 非常感谢。解决了我的问题。我现在需要在一个有 100 万行的数据集上对其进行测试,看看遍历整个数据集需要多长时间。
    【解决方案2】:

    你可以使用MultiIndex.isin:

    c = ['x', 'y']
    df1.loc[df1.set_index(c).index.isin(df2.set_index(c).index), 'knn'] = 0
    

       x  y  knn
    0  1  1    0
    1  1  2    0
    2  1  3    0
    3  1  4    0
    

    【讨论】:

      猜你喜欢
      • 2016-02-03
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多