Как я могу проверить, являются ли почти все строки идентичными, и если это так, то убедитесь, что последняя отличающаяся строка изменяется на некоторую константу k - PullRequest
0 голосов
/ 05 октября 2019

с использованием набора данных радужной оболочки с измерением (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')

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Сначала вам нужно отфильтровать столбцы, которые вы хотите сравнить. В этом случае столбцы 0, 1 и 3 путем следующего сравнения df.iloc[row1,[0, 1, 3]] == df.iloc[row2, [0, 1, 3]]. Это возвращает массив значений True или False. Но вам нужно, чтобы все столбцы были одинаковыми. Чтобы подтвердить, что вам нужен метод .all(). Он возвращает true, только если все значения в массиве равны True. В итоге:

if (df.iloc[row1,identical_columns] == df.iloc[row2, identical_columns]).all():

И так как вам нужно перебирать каждую возможную комбинацию строк, хорошо подойдет двойной цикл 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")
0 голосов
/ 05 октября 2019

Сообщение об ошибке в основном говорит вам, как это исправить:

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

должно быть:

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