我剛剛開始使用 Python,我試圖for-loop在每一行上回圈,并根據給定的條件在每次迭代中隨機選擇兩列并更改它們的值。在for-loop沒有任何問題的作品; 但是,結果在dataframe.
一個可重現的例子:
df= pd.DataFrame({'A': [10,40,10,20,10],
'B': [10,10,50,40,50],
'C': [10,20,10,10,10],
'D': [10,30,10,10,50],
'E': [10,10,40,10,10],
'F': [2,3,2,2,3]})
df:
A B C D E F
0 10 10 10 10 10 2
1 40 10 20 30 10 3
2 10 50 10 10 40 2
3 20 40 10 10 10 2
4 10 50 10 50 10 3
這是我的for-loop;for 回圈遍歷所有行并檢查列 F 上的值是否為 2;它隨機選擇兩列值為 10 并將它們更改為 100。
for index, i in df.iterrows():
if i['F'] == 2:
i[i==10].sample(2, axis=0) 100
print(i[i==10].sample(2, axis=0) 100)
這是回圈的輸出:
E 110
C 110
Name: 0, dtype: int64
C 110
D 110
Name: 2, dtype: int64
C 110
D 110
Name: 3, dtype: int64
這是dataframe預期的樣子:
df:
A B C D E F
0 10 10 110 10 110 2
1 40 10 20 30 10 3
2 10 50 110 110 40 2
3 20 40 110 110 10 2
4 10 50 10 50 10 3
但是, 上的列dataframe沒有變化。知道出了什么問題嗎?
uj5u.com熱心網友回復:
這一行:
i[i==10].sample(2, axis=0) 100
.sample回傳一個新的資料幀,因此原始資料幀 ( df) 根本沒有更新。
嘗試這個:
for index, i in df.iterrows():
if i['F'] == 2:
cond = (i == 10)
# You can only sample 2 rows if there are at
# least 2 rows meeting the condition
if cond.sum() >= 2:
idx = i[cond].sample(2).index
i[idx] = 100
print(i[idx])
uj5u.com熱心網友回復:
您不應就地修改原始 df。復制并迭代:
df2 = df.copy()
for index, i in df.iterrows():
if i['F'] == 2:
s = i[i==10].sample(2, axis=0) 100
df2.loc[index,i.index.isin(s.index)] = s
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352905.html
下一篇:Python:回圈索引問題
