Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列可能不存在的数据帧上的布尔屏蔽_Python_Pandas_Dataframe - Fatal编程技术网

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我以可复制粘贴的形式添加了数据帧。