Python 列可能不存在的数据帧上的布尔屏蔽
我有一个名为Python 列可能不存在的数据帧上的布尔屏蔽,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个名为compare的数据帧,看起来如下: 居民 1xdisc 1xdisc\U文件 康帕克 停车 停车场文件 康米尔 康密尔大学博士 害虫 pest_文件 宠物 pet1x 宠物医生 租金 租金单据 stlc 存储 垃圾 垃圾桶 水 水务署 约翰 0 -500 0 50 50 0 0 3. 3. 0 0 0 1803 1803 0 0 30 30 0 0 切尔顿 -500 0 0 50 50 0 0 1.25 1.25 0 0 0 1565 1565 0 0 30 30 0 0 刁 -3
compare
的数据帧,看起来如下:
居民
1xdisc
1xdisc\U文件
康帕克
停车
停车场文件
康米尔
康密尔大学博士
害虫
pest_文件
宠物
pet1x
宠物医生
租金
租金单据
stlc
存储
垃圾
垃圾桶
水
水务署
约翰
0
-500
0
50
50
0
0
3.
3.
0
0
0
1803
1803
0
0
30
30
0
0
切尔顿
-500
0
0
50
50
0
0
1.25
1.25
0
0
0
1565
1565
0
0
30
30
0
0
刁
-300
-300
0
0
0
0
0
3.
3.
0
0
0
1372
1372
0
0
18
18
0
0
我不是熊猫专家,因此可能有一种更简单的库方法来实现这一点,但这里有一个相对python的、适应性强的实现:
mask=True
对于df.columns中的col_name:
#效率低但可读性好,可以把它记下来
#以更好的数据结构转换为O(n)
如果df.columns中的col_name+“_doc”:
mask=mask&(df[col_name]!=df[col_name+''u doc']))
非匹配=df[掩码]
如果列名并不总是存在,您可以添加不存在的列,我认为这不是一个好主意,因为您必须复制相应的列,这将最终增加数据帧的大小
因此,另一种方法可能是过滤列名本身并只获取存在的列对:
给定数据帧:
测向头(3)
居民1 xdisc 1 xdisc 1 xdisc 1 xdisc u doc conpark停车场\u doc conmil conmil \u doc pest pest \u doc pet 1X pet \u doc租金\u doc stlc存储垃圾桶\u doc水\u doc
0金合欢0 0 0 0 0 0 0-500 3.0 3.0 0 0 70 2067 2067 0 0 15 0 0 0
1阿什利0 0 0 0 0 3.0 3.0 0 0 0 0 0 2067 2067 0 0 15 0 0
2希拉0 0 0 0 0 0 0 0 0 0 0 1574 1574 0 0 0 0 0 0 0 0 0
取出列对:
>>如果df中的col[:-4]和col.endswith(“'u doc'),则df中的col的maskingCols=[(col[:-4],col)]
冒牌货
[('1xdisc','1xdisc_doc'),('parking','parking_doc'),('conmil','conmil_doc'),('pest','pest_doc'),('pet','pet_doc'),('rent','rent_doc'),('trash','trash_doc]
现在已经有了列对,可以创建屏蔽数据帧所需的表达式
>>“|”。.join(f)(df['{col1}']!=df['{col2}'])表示冒名cols中的col1和col2)
(df['1xdisc']!=df['1xdisc_doc'])(df['parking']!=df['parking_doc'])(df['conmil']!=df['conmil_doc'])(df['pest']!=df['pest_doc'])(df['pet']!=df['pet_doc'])(df['rent'!=df['rent_doc']))(df['rent|垃圾桶])(df['rent']
只需将此表达式字符串传递给eval
函数即可对其求值
>>eval(“|”。.join(f)(冒牌货中的col1和col2的df['{col1}]!=df['{col2}]]))
您可以添加除此掩蔽之外的其他条件:
>>eval(“|”。.join(f”(df['{col1}]!=df['{col2}]])用于col1,col2在maskingCols中)((df['1xdisc']!=df['1xdisc\u doc'])和(df['conpark'!=df['1xdisc']))
0对
1错误
2错误
3错误
4正确
5错误
6错误
7错误
8正确
9错误
数据类型:bool
您可以使用它来获取所需的数据帧:
>>df[eval(“|”).join(f”(df['{col1}]!=df['{col2}])表示col1,col2在maskingCols中)((df['1xdisc'!=df['1xdisc'u doc'])和(df['conpark']!=df['1xdisc'])]
输出:
Resident 1xdisc 1xdisc\u doc conpark停车场\u doc conmil conmil\u doc pest pest\u doc pet 1x pet\u doc租金\u doc stlc存储垃圾垃圾\u doc水\u doc
0金合欢0 0 0 0 0 0 0-500 3.0 3.0 0 0 70 2067 2067 0 0 15 0 0 0
4丹妮尔0 0 0 0 0 0 0 0 0 0 1422 0 0 0 0 0 0 0 0
8沙娟0 0 0 0 0.0 0 0 0 1768 0 0 0 0 0 0 0 0
请以可复制粘贴的方式发布数据框code@Gulzar我以可复制粘贴的形式添加了数据帧。