首页 > 解决方案 > 更有效的迭代方式

问题描述

我想返回与前一列位置相比位置下降的行项目。有没有更好/更简单的方法来做到这一点?我有数据框,其中有按顺序排列的项目,并且顺序可以在下一列(周)中更改:

s1 = pd.Series(["item1", "item2", "item3"])
s2 = pd.Series(["item2", "item1", "item3"])
s3 = pd.Series(["item3","item2", "item1"])
data = pd.DataFrame({"week1":s1, "week2":s2, "week3":s3})

# I did it like this

counter1 = 0 # iterate all columns
idxfirst = 0 # manually index
idxsecond = 0 # manually index
numberofcolumns = (len(data.columns))-1

for i in range(numberofcolumns):
    idxfirst = 0
    for i in data.iloc[:,counter1]:
        idxsecond = 0
        for j in data.iloc[:,(counter1+1)]:
            if i == j and idxfirst < idxsecond:
                print(i)
        
            idxsecond += 1
        
        idxfirst +=1
        
    counter1 +=1
prints:
item1 # because position dropped from 1 to 2 in second week
item2 # because position dropped from 1 to 2 in second week
item1 # because position dropped from 2 to 3 in third week

标签: pythonpandas

解决方案


您可以使用以下方法简化代码enumerate()

s1 = pd.Series(["item1", "item2", "item3"])
s2 = pd.Series(["item2", "item1", "item3"])
s3 = pd.Series(["item3","item2", "item1"])
data = pd.DataFrame({"week1":s1, "week2":s2, "week3":s3})

numberofcolumns = (len(data.columns))-1

for counter1,i in enumerate(range(numberofcolumns)):
    for idxfirst,i in enumerate(data.iloc[:,counter]):
        for idxsecond,j in enumerate(data.iloc[:,(counter+1)]):
            if i == j and idxfirst < idxsecond:
                print(i)

推荐阅读