比较两列中的每个值

时间:2019-06-03 00:09:42

标签: python pandas numpy dataframe

如何比较数据框中的两列,并根据这两列的差异有效地创建新列?

我的表中有一个功能,其中有很多缺失的值,我需要使用数据库中包含该功能的其他表来回填这些信息。我已经使用np.select将原始表中的功能与其他表中的相同功能进行了比较,但是我觉得应该有一个简单的方法。

例如:pd.DataFrame({'A': [1,2,3,4,np.nan], 'B':[1,np.nan,30,4,np.nan]})

我希望新列包含值[1,2,"different",4,np.nan]。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

pandas.Series.combine_firstpandas.DataFrame.combine_first在这里可能有用。它们的操作类似于SQL COALESCE,并通过选择第一个非空值(如果存在)来组合两列。

df = pd.DataFrame({'A': [1,2,3,4,np.nan], 'B':[1,np.nan,30,4,np.nan]})
C = df.A.combine_first(df.B)

C看起来像:

0    1.0
1    2.0
2    3.0
3    4.0
4    NaN

然后,要满足您的要求,即两个不同的非null值在组合时应提供“不同”,只需找到这些索引并更新值即可。

mask = ~df.A.isna() & ~df.B.isna() & (df.A != df.B)
C[mask] = 'different'

C现在看起来像:

0            1
1            2
2    different
3            4
4          NaN

答案 1 :(得分:0)

另一种方法是将pd.DataFrame.iterrowsnunique一起使用:

import pandas as pd

df['C'] = [s['A'] if s.nunique()<=1 else 'different' for _, s in df.iterrows()]

输出:

     A     B          C
0  1.0   1.0          1
1  2.0   NaN          2
2  3.0  30.0  different
3  4.0   4.0          4
4  NaN   NaN        NaN