首页 > 解决方案 > Pandas DataFrame 对多列的按位“&”操作

问题描述

我偶然发现了 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.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

标签: pythonpandas

解决方案


原因是不同的列名,所以它的工作方式类似于通过两个列名的联合重新索引,换句话说,就像另一个缺失的行被添加了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

如果两个 DataFrame 中的长度始终相同,则可以将其中一个转换为 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

推荐阅读