【问题标题】:How do I update some values of my target column in a dataframe by matching its multiple columns with one column in another dataframe in python?python - 如何通过将多个列与python中另一个数据框中的一列匹配来更新数据框中目标列的某些值?
【发布时间】:2018-03-19 14:53:16
【问题描述】:

我有两个熊猫数据框:

  • df1
  • df2

df1 如下所示:

a     f1     f2     f3     target
1     aa     bb     cc     NaN
2     xx     yy     zz     NaN
more rows....

df2 看起来像这样:

b     f1     target
3     bb     450
4     xx     220
more rows....

df1 的期望输出是这样的:

a     f1     f2     f3     target
1     aa     bb     cc     450
2     xx     yy     zz     220
more rows....

这是我的问题:

如何通过将df2["f1"]df1["f1"] 匹配 df1["f2"] df1["f3"] 来使用来自df2["target"] 的值更新df1["target"]。 p>

合并和更新功能对我不起作用,因为我需要匹配多个列。我看到的其他解决方案也用于匹配所有多列,但我的数据并非如此。 (我只需要将一列与 ANY 多列相匹配。)

谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一种方法是创建一个字典,如果可能,将其应用于第一列,如果可能,第二列等等。

    d = dict(zip(df2.f1.values,df2.target.values))
    df1.target = df1.apply(lambda r: d.get(r['f1'],d.get(r['f2'],d.get(r['f3']))), axis=1)
    

    【讨论】:

      【解决方案2】:

      考虑迭代合并到一个附加的数据帧中,该数据帧合并到原始数据帧:

      # PAIRWISE MERGE FIELDS
      merge_cols = [[i, 'f1'] for i in list(df1.columns[1:len(df1.columns)-1])]
      # LIST OF INNER JOIN MERGES
      dfs = [pd.merge(df1, df2, left_on=m[0], right_on=m[1], how='inner') for m in merge_cols]
      
      # APPEND DFS
      stackdf = pd.concat(dfs)[['a','target_y']]
      finaldf = stackdf.merge(df1, on='a')\
                       .assign(target=stackdf['target_y'].values)\
                       .drop(['target_y'], axis=1)
      
      print(finaldf)
      #    a  f1  f2  f3  target
      # 0  2  xx  yy  zz     220
      # 1  1  aa  bb  cc     450
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 2018-06-25
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        相关资源
        最近更新 更多