[英]“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.