在遍历期间更新数据框
Posted
技术标签:
【中文标题】在遍历期间更新数据框【英文标题】:Updating Dataframe during Traversal 【发布时间】:2021-12-19 10:29:36 【问题描述】:我正在使用数据框,并且在遍历它们时需要删除几行。
简要概述:我读取了一行 (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()
【问题讨论】:
【参考方案1】:pandas.DataFrame.iterrows():
你不应该修改你正在迭代的东西。这不能保证在所有情况下都有效。根据数据类型,迭代器返回一个副本而不是一个视图,写入它不会有任何效果。
有很多技巧可以解决问题:
1:您可以迭代 df
的 len 而不是 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()
【讨论】:
以上是关于在遍历期间更新数据框的主要内容,如果未能解决你的问题,请参考以下文章
C# - Winforms - Combobox - 避免选择更新数据源的第一项