【问题标题】:Compare two columns with NaNs in Pandas and get differences在 Pandas 中将两列与 NaN 进行比较并获得差异
【发布时间】:2020-12-07 02:15:07
【问题描述】:

我有以下数据框:

case c1   c2
1    x    x
2    NaN  y
3    x    NaN
4    y    x
5    NaN  NaN 

我想得到一个“匹配”列,它将显示哪些记录在“c1”和“c2”中的值相等或不同:

case c1   c2   match
1    x    x    True  
2    NaN  y    False
3    x    NaN  False
4    y    x    False
5    NaN  NaN  True 

我根据另一个 Stack Overflow 问题尝试了以下操作:Comparing two columns and keeping NaNs 但是,我无法将案例 4 和案例 5 都正确。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'case': [1, 2, 3, 4, 5],
    'c1': ['x', np.nan,'x','y', np.nan],
    'c2': ['x', 'y',np.nan,'x', np.nan],
})

cond1 = df['c1'] == df['c2']
cond2 = (df['c1'].isnull()) == (df['c2'].isnull())

df['c3'] = np.select([cond1, cond2], [True, True], False)

df

【问题讨论】:

    标签: python pandas numpy dataframe numpy-ndarray


    【解决方案1】:
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'case': [1, 2, 3, 4, 5],
        'c1': ['x', np.nan,'x','y', np.nan],
        'c2': ['x', 'y',np.nan,'x', np.nan],
    })
    
    
    df['c3'] = df.apply(lambda row: True if str(row.c1) == str(row.c2) else False, axis=1)
    
    
    print(df)
    

    输出

       case   c1   c2     c3
    0     1    x    x   True
    1     2  NaN    y  False
    2     3    x  NaN  False
    3     4    y    x  False
    4     5  NaN  NaN   True
    

    【讨论】:

      【解决方案2】:

      nuquinefillna 一起使用

      import numpy as np
      
      df.fillna(np.inf)[['c1','c2']].nunique(1) < 2
      

      nunique 带有选项dropna=False

      df[['c1','c2']].nunique(1, dropna=False) < 2
      
      Out[13]:
      0     True
      1    False
      2    False
      3    False
      4     True
      dtype: bool
      

      【讨论】:

        【解决方案3】:

        eqisna 一起使用:

        df.c1.eq(df.c2)|df.iloc[:, 1:].isna().all(1)
        #or
        df.c1.eq(df.c2)|df.loc[:, ['c1','c2']].isna().all(1)
        

        【讨论】:

        • 是否可以给df.iloc[:, 1:].isna().all(1)提供实际的列名?
        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        相关资源
        最近更新 更多