使用维数为(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')
错误消息基本上告诉您如何解决此问题:
if df.iloc[row,:]==df.iloc[row+1,:]:
它必须是:
if (df.iloc[row,:]==df.iloc[row+1,:]).all():
首先,您需要过滤要比较的列。在这种情况下,通过执行以下比较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")