首页 > 解决方案 > 迭代数据框时所做的更改不保存

问题描述

我有一个在某种程度上具有“重复”行的数据框。假设我有一排A = ['name' : john, 'age' : 15, 'email' : NaN, 'school' : middle]和一排B = ['name' : john, 'age' : 15, 'email' : john@gmail.com, 'school' : NaN]。A 和 B 的结果行应该是['name' : john, 'age' : 15, 'email' : john@gmail.com, 'school' : middle].

到目前为止,我已经尝试在数据帧上使用 iterrows() 并更改值,但更改不会保存。我的代码:

duplicated = df[df.duplicated(['name', 'age'], keep = False)].sort_values('name')
row_iterator = duplicated.iterrows()

_, last = row_iterator.__next__()
for k, row in row_iterator:
    if row['name'] == last['name']:
        for i in duplicated.columns:
            if row[i] == last[i]:
                continue
            if pd.isna(row[i]):
                row[i] = last[i]
            if pd.isna(last[i]):
                last[i] = row[i]
    last = row

df 是我拥有所有数据的数据框的名称。然后我只将重复的行剪切成duplicated. 之后,我遍历数据框并尝试随时进行更改。但是我所做的更改最终会丢失或其他东西。我究竟做错了什么?

标签: pythonpandasdataframeduplicates

解决方案


我们可以通过两种方式解决您的问题:

方法 1:使用bfill,ffilldrop_duplicates:

df = df.bfill().ffill().drop_duplicates()

   name  age           email  school
0  john   15  john@gmail.com  middle

方法 2 : GroupBy.first:

df = df.groupby(['name', 'age']).first().reset_index()

   name  age           email  school
0  john   15  john@gmail.com  middle

推荐阅读