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

问题描述 投票:0回答:2

使用维数为(150,4)的虹膜数据集,我想查看第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')
python pandas comparison filtering rows
2个回答
0
投票

错误消息基本上告诉您如何解决此问题:

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

它必须是:

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

0
投票

首先,您需要过滤要比较的列。在这种情况下,通过执行以下比较df.iloc[row1,[0, 1, 3]] == df.iloc[row2, [0, 1, 3]]来创建第0、1和3列。这将返回一个True或False值的数组。但是您需要all列相同。要完成此操作,需要使用.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")
© www.soinside.com 2019 - 2024. All rights reserved.