我正在處理資料幀,在遍歷它們時需要洗掉幾行。
簡要概述:我讀取一行(N),將其與接下來的20行(直到N 20)進行比較,并根據比較洗掉N和N 20之間的幾行。然后我回到 N 1,將該行與接下來的 20 行進行比較,直到 N 1 20。我不想將 N 1 與我之前洗掉的行進行比較。
但是,當我洗掉行時,洗掉不會反映在資料框中,因為我正在遍歷其原始副本,并且更改沒有反映。對此有任何解決方案嗎?
df = pd.read_csv(r"C:\snip\test.csv")
index_to_delete = []
for index, row in df.iterrows():
snip
for i in range(20):
if (index i 1) < len(df.index):
if condition:
index_to_delete.append(index i 1) #storing indices of rows to delete between N and N 20
df.loc[index, ['snip1', 'snip2']] = [snip, snip] #updating values in row N
df = df.drop(index_to_delete)
index_to_delete.clear()
uj5u.com熱心網友回復:
pandas.DataFrame.iterrows():
你永遠不應該修改你正在迭代的東西。這不能保證在所有情況下都有效。根據資料型別,迭代器回傳一個副本而不是一個視圖,寫入它沒有任何效果。
有很多技巧可以解決問題:
1:你可以迭代 lendf而不是迭代 on df。
for inx in range(len(df)):
try:
row = df.loc[inx]
except:
continue
2:存盤檢查的索引并跳過它們
df = pd.read_csv(r"C:\snip\test.csv")
all_index_to_delete = []
index_to_delete = []
for index, row in df.iterrows():
if index in all_index_to_delete:
continue
snip
for i in range(20):
if (index i 1) < len(df.index):
if condition:
index_to_delete.append(index i 1) #storing indices of rows to delete between N and N 20
all_index_to_delete.append(index i 1) #storing indices of rows to delete between N and N 20
df.loc[index, ['snip1', 'snip2']] = [snip, snip] #updating values in row N
df = df.drop(index_to_delete)
index_to_delete.clear()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349868.html
