【问题标题】:Pandas check if two columns are the same熊猫检查两列是否相同
【发布时间】:2019-10-16 09:03:51
【问题描述】:
df = {'A':[3, 4, 5, np.nan, 6, 7],
        'B':[np.nan, 4, np.nan, np.nan, 6, 7]}

我有一个包含两列 A 和 B 的数据框。我想创建一个新列 C,这是检查 A 和 B 是否相同的结果,如果它们相同,则保留它,但如果一个为 NaN,则保留其他值。 A 列和 B 列始终是值或 NaN。 A 和 B 中的值始终相同。

我知道如何检查A和B是否相同:

df['C'] = (df['A'] == df['B]).astype('object')

但这在 C 列中给出了一个布尔答案,无论是真还是假。我的预期输出是:

A   B   C
3  NaN  3
4   4   4
5  NaN  5
NaN NaN NaN
6   6   6
7   7   7

【问题讨论】:

  • 当 A 列和 B 列具有不同的值(即不为 NaN 且不等于)时需要什么?
  • 啊,是的 - 我将编辑帖子,但它们始终是 NaN 或值,值将始终相同。

标签: python pandas


【解决方案1】:

使用np.select 可以检查多个条件。

df = pd.DataFrame({'A':[3, 4, 5, np.nan, 6, np.nan],
    'B':[np.nan, 4, np.nan, np.nan, 6, 7]})

df['c'] = np.select([df['A'].isnull() & df['B'].isnull(), df['A'].isnull()], 
                     [np.nan, df['B']], df['A'])

输出:

    A    B       c
0   3.0  NaN     3.0
1   4.0  4.0     4.0
2   5.0  NaN     5.0
3   NaN  NaN     NaN
4   6.0  6.0     6.0
5   NaN  7.0     7.0

【讨论】:

    【解决方案2】:

    您可以使用np.where()

    >>> df = pd.DataFrame({'A':[3, 4, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
    >>> df
         A    B
    0  3.0  NaN
    1  4.0  4.0
    2  5.0  NaN
    3  NaN  NaN
    
    >>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
    >>> df
         A    B    C
    0  3.0  NaN  3.0
    1  4.0  4.0  4.0
    2  5.0  NaN  5.0
    3  NaN  NaN  NaN
    

    编辑样本

    表明如果 df['A'] 是 nan 并且 df['B'] 有值,它将起作用。

    >>> df = pd.DataFrame({'A':[3, np.nan, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
    >>> df
         A    B
    0  3.0  NaN
    1  NaN  4.0
    2  5.0  NaN
    3  NaN  NaN
    
    >>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
    >>> df
         A    B    C
    0  3.0  NaN  3.0
    1  NaN  4.0  4.0
    2  5.0  NaN  5.0
    3  NaN  NaN  NaN
    

    谢谢:D

    【讨论】:

    • 使用isna() 标记它。正在更新答案。
    【解决方案3】:

    如果保证 A 和 B 在不是 nans 时是相同的值,那么看起来您可以在这里使用 .combine_first

    df['C'] = df.A.combine_first(df.B)
    

    【讨论】:

      【解决方案4】:

      我认为fillna 足以满足您的要求

      df['C'] = df.A.fillna(df.B)
      
      Out[92]:
           A    B    C
      0  3.0  NaN  3.0
      1  4.0  4.0  4.0
      2  5.0  NaN  5.0
      3  NaN  NaN  NaN
      4  6.0  6.0  6.0
      5  7.0  7.0  7.0
      

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 2021-07-12
        相关资源
        最近更新 更多