Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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 复杂if语句返回所有true_Python_Pandas_If Statement - Fatal编程技术网

Python 复杂if语句返回所有true

Python 复杂if语句返回所有true,python,pandas,if-statement,Python,Pandas,If Statement,下面是我的代码。我试图解析数据帧并存储公司匹配项。但是,if语句始终返回true,并且所有内容都保存在数据框当前客户中,即使我的150行中有10行的值大于97。我的代码下面是我的数据示例 current_customers = pandas.DataFrame() potential_customers = pandas.DataFrame() for i in range(0, len(FDA_useful_companies_bing)): if combined_data['mat

下面是我的代码。我试图解析数据帧并存储公司匹配项。但是,if语句始终返回true,并且所有内容都保存在数据框
当前客户
中,即使我的150行中有10行的值大于97。我的代码下面是我的数据示例

current_customers = pandas.DataFrame()
potential_customers = pandas.DataFrame()
for i in range(0, len(FDA_useful_companies_bing)):
    if combined_data['match token sort'].iloc[i] or combined_data['match ratio'].iloc[i] or combined_data['match partial ratio'].iloc[i] > 97:
        current_customers = current_customers.append(combined_data.ix[i,4::])
    else:
        potential_customers = potential_customers.append(combined_data.ix[i,4::])
我的数据样本

Company                             City            State       ZIP     FDA Company                 FDA City            FDA State   FDA ZIP Token sort ratio              match token sort  Ratio                           match ratio    Partial Ratio            match partial ratio
NOVARTIS                            Larchwood       IA          51241   HELGET GAS PRODUCTS INC     Kansas City         MO          64116   AIR PRODUCTS  CHEMICALS INC   73                OCEANIC MEDICAL PRODUCTS INC    59             LUCAS INC                78
BOEHRINGER INGELHEIM VETMEDICA INC  Sioux Center    IA          51250   SOUTHWEST TECHNOLOGIES INC  North Kansas City   MO          64116   SOUTHWEST TECHNOLOGIES        100               SOUTHWEST TECHNOLOGIES          92             SOUTHWEST TECHNOLOGIES   100
编辑:
此外,如果有更有效的方法,我很乐意听到

正如您所怀疑的,您的问题在于if语句:

if combined_data['match token sort'].iloc[i] or combined_data['match ratio'].iloc[i] or combined_data['match partial ratio'].iloc[i] > 97:
您询问表达式“combined_data['match token sort'].iloc[i]”是否为真,它是一个大于0的数字,因此根据Python,它是一个truthes值。因此,整个表达式返回True

我将添加括号以更清楚地说明Python是如何解释这一行代码的:

if (combined_data['match token sort'].iloc[i]) or 
    (combined_data['match ratio'].iloc[i]) or 
    (combined_data['match partial ratio'].iloc[i] > 97):
Python单独计算括号中的语句,并因此用作条件语句,返回True。下面是一个正确的表达:

if (combined_data['match token sort'].iloc[i]) > 97 or 
        (combined_data['match ratio'].iloc[i]) > 97 or 
        (combined_data['match partial ratio'].iloc[i] > 97):
现在,Python将按照您的意愿将每个操作作为一个比较操作来执行。

IIUC您只需执行以下操作:

current_customer = combined_data[(combined_data[['match token sort','match ratio','match partial ratio']] > 97).any(axis=1)]

potential_customer = combined_data[(combined_data[['match token sort','match ratio','match partial ratio']] <= 97).all(axis=1)]
这相当于:

if some_val or another_val or last_val > 95
因此,如果某个值为非零或另一个值为非零,则整个语句的计算结果为
True

您可以在简化的案例中看到这一点:

In [83]:
x = 1    ​
if 5 or x > 95:
    print('True')
else:
    print('False')
这将产生:

True
仅进行一次比较:

In [85]:
if 5 > 95:
    print('True')
else:
    print('False')
产出:

False
但将每个值与目标值进行比较:

In [87]:
x=1
if 5 > 95 or x > 95:
    print('True')
else:
    print('False')
现在打印:

False

但这里真正的要点是根本不循环,您可以通过传递感兴趣的列从df中进行子选择,然后您可以将整个df与标量值进行比较,并使用
any(axis=1)
生成布尔掩码,并使用该掩码来屏蔽df以返回当前客户,然后反转比较并使用
all(axis=1)
查找没有一个col满足您之前比较的行,以过滤潜在客户的df

我不认为我的是重复的,因为我的与pandas dataframe如何使用if语句有关。不,问题是标准Python
foo或bar或baz>97对于foo和bar的非0值将始终返回True。您是对的。我不明白这个错误。哈哈,我知道必须有一个更简单的方法来做到这一点。我很感激花时间解释为什么你的例子总是正确的!但是,
axis=1
命令很难理解。
axis=1
参数表示我们希望比较按行进行,而不是按列进行,
axis=0
您应该尝试将其从
1
更改为
0
,以查看差异
False