在遍历期间更新数据框

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() 

【讨论】:

以上是关于在遍历期间更新数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何更新python中熊猫数据框特定列中的所有行?

更新期间停止文本框闪烁

C# - Winforms - Combobox - 避免选择更新数据源的第一项

Swing GUI 在数据处理期间不更新

使用任务或线程从大数据表(进度数据库)逐行更新数据网格,但在更新期间保持 UI 响应

diffable 数据源节标题在更新期间闪烁