Python “按位数据帧”&&引用;多列操作

Python “按位数据帧”&&引用;多列操作,python,pandas,Python,Pandas,我偶然发现了熊猫的以下行为,有人知道为什么输出有6列而不是3列吗 dfa = pd.DataFrame(dict(col1=[np.nan,1,1], col2=[np.nan,np.nan,np.nan], col3=[1,1,1])) dfb = pd.DataFrame(dict(col4=[1,np.nan,1], col5=[np.nan,np.nan,np.nan], col6=[np.nan,1,np.nan])) # output dfa.isnull() & dfb.

我偶然发现了熊猫的以下行为,有人知道为什么输出有6列而不是3列吗

dfa = pd.DataFrame(dict(col1=[np.nan,1,1], col2=[np.nan,np.nan,np.nan], col3=[1,1,1]))
dfb = pd.DataFrame(dict(col4=[1,np.nan,1], col5=[np.nan,np.nan,np.nan], col6=[np.nan,1,np.nan]))

# output
dfa.isnull() & dfb.notnull()
    col1    col2    col3    col4    col5    col6
0   False   False   False   False   False   False
1   False   False   False   False   False   False
2   False   False   False   False   False   False


原因是列名称不同,所以它的工作方式类似于通过两个列名称的并集来重新索引,换句话说,类似于另一个缺少的行添加了
False
值:

c = dfa.columns.union(dfb.columns)
m = (dfa.isnull().reindex(c, fill_value=False, axis=1) & 
     dfb.notnull().reindex(c, fill_value=False, axis=1))
print (m)
    col1   col2   col3   col4   col5   col6
0  False  False  False  False  False  False
1  False  False  False  False  False  False
2  False  False  False  False  False  False
详细信息

print (dfa.isnull().reindex(c, fill_value=False, axis=1))
    col1  col2   col3   col4   col5   col6
0   True  True  False  False  False  False
1  False  True  False  False  False  False
2  False  True  False  False  False  False

print (dfb.notnull().reindex(c, fill_value=False, axis=1))
    col1   col2   col3   col4   col5   col6
0  False  False  False   True  False  False
1  False  False  False  False  False   True
2  False  False  False   True  False  False
如果将它们更改为相同,则获取3列:

dfb.columns = dfa.columns
m = dfa.isnull() & dfb.notnull()
print (m)
    col1   col2   col3
0   True  False  False
1  False  False  False
2  False  False  False
通过字典重命名列的解决方案:

d = dict(zip(dfb.columns, dfa.columns))
m = dfa.isnull() & dfb.rename(columns=d).notnull()
print (m)
    col1   col2   col3
0   True  False  False
1  False  False  False
2  False  False  False
如果两个数据帧中的长度始终相同,则可以将其中一个数据帧转换为numpy数组:

m = dfa.isnull() & dfb.notnull().to_numpy()
print (m)
    col1   col2   col3
0   True  False  False
1  False  False  False
2  False  False  False