如何用逻辑或合并两个带日期索引的Pandas DataFrame?
Pandas合并DataFrame并对共同列取逻辑或
当然有办法实现这个需求!针对你给出的场景,这里有两种简洁的解决方案:
方法1:使用combine方法(索引完全匹配时推荐)
combine方法可以让我们对两个DataFrame的对应元素应用自定义逻辑,同时通过fill_value处理缺失的列/行。对于你的需求,我们直接用逻辑或操作(|),缺失的位置填充False即可:
import pandas as pd # 构造示例数据(和你的输入一致) A = pd.DataFrame( {'a': [True, False, False], 'b': [False, True, False], 'c': [False, False, True]}, index=pd.to_datetime(['2018-02-19', '2018-02-20', '2018-02-21']) ) B = pd.DataFrame( {'a': [False, False, True], 'b': [True, False, True], 'd': [True, False, True]}, index=pd.to_datetime(['2018-02-19', '2018-02-20', '2018-02-21']) ) # 核心代码 C = A.combine(B, lambda x, y: x | y, fill_value=False)
运行后得到的C就是你想要的结果:
>>> C a b c d Timestamp 2018-02-19 True True False True 2018-02-20 False True False False 2018-02-21 True True True True
原理:
- 对于两个DataFrame都有的列(
a、b),对应元素直接做逻辑或运算; - 对于A独有的列(
c),B中没有对应数据,用fill_value=False填充,结果就是A原有的值(x | False = x); - 对于B独有的列(
d),A中没有对应数据,用fill_value=False填充,结果就是B原有的值(False | y = y)。
方法2:使用concat + groupby(索引不完全匹配时适用)
如果你的两个DataFrame索引可能存在不一致的情况,这个方法更通用:先按列拼接两个DataFrame,填充缺失值为False,再按列名分组,对每组取any()(逻辑或的等价操作,只要组内有一个True结果就是True):
C = pd.concat([A, B], axis=1).fillna(False).groupby(level=0, axis=1).any()
原理:
pd.concat([A, B], axis=1)会把两个DataFrame按列拼接,自动对齐索引,共同列会出现两次;fillna(False)把拼接后产生的缺失值转为False,避免布尔运算出错;groupby(level=0, axis=1)按原始列名分组(拼接后共同列的列名重复,level=0对应原始列名);any()方法对每组内的元素取逻辑或,独有的列只有一组元素,直接保留原数据。
内容的提问来源于stack exchange,提问作者user2317421
相关产品推荐
相关产品推荐

