Pandas多列按位与(&)运算疑问:为何输出6列而非3列?
为什么
dfa.isnull() & dfb.notnull()会输出6列? 嘿,这个问题我刚看到的时候也愣了一下,其实核心原因是Pandas的DataFrame运算会自动按索引和列名对齐,咱们一步步拆解:
1. 先看两个DataFrame的基础结构
你定义的两个DataFrame列名完全不重叠:
dfa有col1/col2/col3三列dfb有col4/col5/col6三列
当你分别执行dfa.isnull()和dfb.notnull()时,得到的是和原DataFrame结构一致的布尔型DataFrame(各自3列)。
2. 二元运算的对齐规则是关键
当你对两个DataFrame执行&这类二元运算时,Pandas会先做外连接式的对齐:
- 保留两个DataFrame的所有行(这里索引都是0/1/2,所以行完全匹配)
- 保留两个DataFrame的所有列(也就是3+3=6列)
- 对于每个DataFrame中不存在的列,会用
NaN填充对应位置的值
3. 布尔运算的结果推导
对齐之后,每一列的&运算逻辑是:
- 对
col1/col2/col3:dfa.isnull()有值,但dfb.notnull()里没有这些列,对应位置是NaN→布尔值 & NaN的结果是False - 对
col4/col5/col6:dfb.notnull()有值,但dfa.isnull()里没有这些列,对应位置是NaN→NaN & 布尔值的结果也是False
所以最终就得到了你看到的6列全False的DataFrame。
如果你想实现“对应位置元素运算”的预期
如果你的需求是忽略列名,只按行和列的位置进行运算(比如dfa的第1列对应dfb的第1列),可以直接操作底层的numpy数组:
result = pd.DataFrame(dfa.isnull().values & dfb.notnull().values, columns=dfa.columns) # 也可以用dfb.columns,按需选择
如果是想让特定列对应运算(比如col1对应col4),可以先修改dfb的列名再运算:
dfb_renamed = dfb.rename(columns={'col4':'col1', 'col5':'col2', 'col6':'col3'}) result = dfa.isnull() & dfb_renamed.notnull()
内容的提问来源于stack exchange,提问作者Scoodood
相关产品推荐
相关产品推荐

