簡體   English   中英

“您永遠不要修改要迭代的內容”。 那我該如何修改呢?

[英]“You should never modify something you are iterating over”. How do I modify it then?

我已經閱讀了Pandas文檔,並在此處發表了許多評論,您永遠不要修改要迭代的內容。

假設我有這個dataframe

mydf = pd.DataFrame({'name':['jim','john','mary','michael'],
                    'age':[12,46,44,32]})

      name  age
0      jim   12
1     john   46
2     mary   44
3  michael   32

我想做以下事情:

1.如果名稱以j開頭,則在名稱中添加'smith'

2.如果年齡大於40,則將其乘以2。

所以我創建一個函數來做到這一點:

def modify(df):

    for i in range(len(df)):

        # if age is >40
        if df.loc[i,'age'] > 40:

            # multiply it by 2
            df.loc[i,'age'] = df.loc[i,'age']*2

        # get the name
        name = df.loc[i,'name']

        # if it starts with 'j'
        if name[0]=='j':

            # add 'smith' to the name
            name = name+' '+'smith'

        # insert into cell    
        df.loc[i,'name'] = name

應用功能:

modify(mydf)

結果:

print(mydf)

         name  age
0   jim smith   12
1  john smith   92
2        mary   88
3     michael   32

這很好。 所以有什么問題?

我是否應該復制數據框並在最后將其返回? 如下所示:

def modify(df):

    df = df.copy()

    for i in range(len(df)):

        if df.loc[i,'age'] > 40:

            df.loc[i,'age'] = df.loc[i,'age']*2

        name = df.loc[i,'name']

        if name[0]=='j':

            name = name+' '+'smith'

        df.loc[i,'name'] = name

    return df

但是, 我仍在編輯要迭代的內容 所以我想這還是不好嗎?

注意:我正在研究一個比這個更大,更復雜的函數,它具有更多條件和api調用等,可處理100,000行客戶數據。 例如,如果客戶來自城市X, do this ,如果客戶來自城市Y, do that等等,所以我不希望找到這種確切數據框的解決方案。

我只想知道如果完全不推薦您必須迭代並編輯行時該怎么辦。

使用pandas您應始終從for循環中退出。 pandas代表優化那些循環。

這是解決您的問題的代碼:

idx_smith = mydf[mydf["name"].str.startswith("j")].index
idx_age = mydf[mydf["age"] > 40].index
mydf.loc[idx_smith, "name"] = mydf.loc[idx_smith].name + " smith"
mydf.loc[idx_age, "age"] = mydf.loc[idx_age].age*2

mydf

    name    age
0   jim smith   12
1   john smith  92
2   mary    88
3   michael 32

您的問題的答案:您應該對行操作進行迭代,將熊貓與lambda配合使用,以有效地使用內存/ cpu。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM