更有效的迭代方法

2024-09-27 07:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: infromfordatapositionseriespditem1
2条回答

这里有一种完全矢量化的方法,通过“融合”数据帧,将其连接到自身,然后查找满足以下三个条件的行:

  • 第一周的项目与下一周的项目相同
  • 周1+1==周2
  • 第一项的索引小于第二项的索引

    df = data.reset_index().melt(id_vars="index")
    df["week"] = df.variable.str.replace("week", "").astype(int)
    df = df[["index", "value", "week"]]
    df = pd.merge(df.assign(dummy = 1), df.assign(dummy=1), on = "dummy") 
    df[(df.value_x == df.value_y) & (df.week_x + 1 == df.week_y) & (df.index_x < df.index_y)]["value_x"]

输出:

4     item1
34    item2
44    item1
Name: value_x, dtype: object

您可以使用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)

相关问题 更多 >

    热门问题