在 Pandas 中将两列与 NaN 进行比较并获得差异
Posted
技术标签:
【中文标题】在 Pandas 中将两列与 NaN 进行比较并获得差异【英文标题】:Compare two columns with NaNs in Pandas and get differences 【发布时间】: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
【问题讨论】:
【参考方案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】:将nuquine
与fillna
一起使用
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】:将eq
与isna
一起使用:
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)
提供实际的列名?以上是关于在 Pandas 中将两列与 NaN 进行比较并获得差异的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django 中将两列与 group by 相乘和求和
pandas使用shift函数对数数据进行向上偏移(-1)或者向下偏移索引不移动,移动之后无值的赋值为NaN将原数据列与偏移后的数据列相加生成新的数据列