Python 我如何检查几乎所有的行是否都相同,如果是,那么如何验证最终不同的行是否以某个常数k变化

Python 我如何检查几乎所有的行是否都相同,如果是,那么如何验证最终不同的行是否以某个常数k变化,python,pandas,comparison,filtering,rows,Python,Pandas,Comparison,Filtering,Rows,使用维度为(150,4)的iris数据集,我想查看第1列、第2列和第4列中的行是否相同,如果相同,则验证第3列的值是否不同于某个常数k。必须对每个可能的行组合执行此操作。 #### load data### import pandas as pd df=pd.DataFrame(iris.data,columns=iris.feature_names) df.head() 这给了我一个错误“序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all

使用维度为(150,4)的iris数据集,我想查看第1列、第2列和第4列中的行是否相同,如果相同,则验证第3列的值是否不同于某个常数k。必须对每个可能的行组合执行此操作。

#### load data###
import pandas as pd
df=pd.DataFrame(iris.data,columns=iris.feature_names)
df.head()
这给了我一个错误“序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()”,并且不考虑所有行

我在这里选择了k=4

list=range(0,148)

for row in list:
    if df.iloc[row,:]==df.iloc[row+1,:]:
        df.iloc[row,2]-df.iloc[row+1,2]<=4
    else:
        print('nothing')
list=范围(0148)
对于列表中的行:
如果df.iloc[row,:]==df.iloc[row+1,:]:

df.iloc[row,2]-df.iloc[row+1,2]错误消息基本上告诉您如何修复此问题:

if df.iloc[row,:]==df.iloc[row+1,:]:
它需要:

if (df.iloc[row,:]==df.iloc[row+1,:]).all():

首先,需要筛选要比较的列。在本例中,通过执行以下比较,列0、1和3将
df.iloc[row1[0、1、3]==df.iloc[row2[0、1、3]
。这将返回一个真值或假值数组。但您需要所有列都相同。要完成此操作,需要使用
.all()
方法。仅当数组中的所有值都为true时,它才会返回true。总之:

if (df.iloc[row1,identical_columns] == df.iloc[row2, identical_columns]).all():
由于您需要迭代每个可能的行组合,所以double for循环将很好地完成

for row1 in range(m-1):
    for row2 in range(row1+1, m):
        # Check for every row combinaton if the columns are equal
        if (df.iloc[row1,identical_columns] == df.iloc[row2, identical_columns]).all():
            pass
总共:

import numpy as np
import pandas as pd

df = pd.DataFrame(data=np.random.randint(0, 100, (10, 4)))
m = df.shape[0]

identical_columns = [0, 1, 3]
k = 4

# Force rows values to pass
df.iloc[2, :] = [3, 4, 5, 1]
df.iloc[3, :] = [3, 4, 4, 1]

for row1 in range(m-1):
    for row2 in range(row1+1, m):
        # Check for every row combinaton if the columns are equal
        if (df.iloc[row1,identical_columns] == df.iloc[row2, identical_columns]).all():


            if df.iloc[row1,2] - df.iloc[row2,2] <= k:
                # TODO: Implement Your logic
                print ('We pass!')
        else:
            print(f"row {row1} and row {row2} don't pass")
将numpy导入为np
作为pd进口熊猫
df=pd.DataFrame(data=np.random.randint(0100,(10,4)))
m=df.shape[0]
相同的_列=[0,1,3]
k=4
#强制行值传递
df.iloc[2,:]=[3,4,5,1]
df.iloc[3,:]=[3,4,4,1]
对于范围(m-1)中的行1:
对于范围内的行2(行1+1,m):
#检查每一行组合的列是否相等
如果(df.iloc[row1,相同的列]==df.iloc[row2,相同的列])。all():
如果df.iloc[row1,2]-df.iloc[row2,2]