【问题标题】:Python add values from multiple columns from one dataframe to another dataframe if it doesn't exists如果不存在,Python将一个数据框的多列中的值添加到另一个数据框
【发布时间】:2021-07-25 04:26:39
【问题描述】:

我有两个数据框 df1 和 df2,我需要检查 df1 列 x1 和列 x2 中的值是否存在于 df2 列 x 中。如果该值不存在,则将其添加到 df2 列 x 和 NaN 到 df2 列 y。

以下是我所拥有的,它可以工作,但对于大型数据集来说需要很长时间,我觉得可以使用 Pandas 方法对其进行改进和简化。

df1 = pd.DataFrame({'x1':['a', 'b', 'e'], 'x2':['c', 'd', 'b']})

df2 = pd.DataFrame({'x':['d', 'e', 'f'], 'y':['a1', 'b2', 'c3']})

diff = set([*df1[~df1['x1'].isin(df2['x'])]['x1'], *df1[~df1['x2'].isin(df2['x'])]['x2']])

for x in diff:
    df2 = df2.append({"x":x}, ignore_index=True)

df1:

    x1  x2
0   a   c
1   b   d
2   e   b

df2:

    x   y
0   d   a1
1   e   b2
2   f   c3

结果应该是:

x   y
0   d   a1
1   e   b2
2   f   c3
3   c   NaN
4   b   NaN
5   a   NaN

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是完成它的另一种方法,使用 melt + append

    melt_ = pd.melt(df1, value_name='x')[["x"]]
    
    df2.append(melt_, ignore_index=True).drop_duplicates('x')
    

       x    y
    0  d   a1
    1  e   b2
    2  f   c3
    3  a  NaN
    4  b  NaN
    6  c  NaN
    

    【讨论】:

    • 这似乎是仅使用 pandas 的最佳方法,唯一的更正是:melt_ = pd.melt(df1, value_name='x')[["x"]] df2.append(melt_, ignore_index=True).drop_duplicates('x')。谢谢!
    【解决方案2】:

    你想要这个吗-

    from itertools import chain
    value_to_add = set(chain(*df1.values)).difference(df2.x.values)
    df2 = pd.concat([df2,pd.DataFrame({'x':list(value_to_add)})]).reset_index(drop=True)
    

    替代without itertools chain

    value_to_add = set(df1.values.flatten()).difference(df2.x.values)
    df2 = pd.concat([df2,pd.DataFrame({'x':list(value_to_add)})]).reset_index(drop=True)
    

    【讨论】:

      【解决方案3】:
      df2 = pd.concat(
          [
              df2,
              pd.DataFrame({"x": np.setdiff1d(df1, df2["x"])}),
          ]
      )
      print(df2)  # add .reset_index(drop=True) if you want clean index
      

      打印:

         x    y
      0  d   a1
      1  e   b2
      2  f   c3
      0  a  NaN
      1  b  NaN
      2  c  NaN
      

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多