如何在Pandas中更新指定行列数据且不产生重复行
Pandas DataFrame按条件更新指定列的正确方法
问题场景
需要在Pandas DataFrame中,针对Foo值为2和4的行,更新vals列的数据。
初始数据
Foo Bar vals 0 0 a 0 1 1 b 1 2 2 c 2 3 3 d 3 4 4 e 4
期望输出
Foo Bar vals 0 0 a 0 1 1 b 1 2 2 c 78 3 3 d 3 4 4 e 63
错误尝试与结果
使用DataFrame.update()的代码未达到预期,反而修改了错误的行并产生重复的Foo值:
#!/usr/bin/env python3 import pandas as pd df = pd.DataFrame({'Foo': range(5), 'Bar': list('abcde'), 'vals': range(5)}) print(df) df.update( pd.DataFrame({'Foo': [2, 4], 'vals': [78, 63]}) ) print(df)
执行结果:
Foo Bar vals 0 2.0 a 78.0 1 4.0 b 63.0 2 2.0 c 2.0 3 3.0 d 3.0 4 4.0 e 4.0
正确实现方法
方法1:布尔索引直接赋值
这是最直观的方式,通过布尔条件筛选目标行,直接更新vals列:
import pandas as pd df = pd.DataFrame({'Foo': range(5), 'Bar': list('abcde'), 'vals': range(5)}) # 针对单个条件更新 df.loc[df['Foo'] == 2, 'vals'] = 78 df.loc[df['Foo'] == 4, 'vals'] = 63 print(df)
如果需要批量处理多个键值对,可使用字典映射简化操作:
update_map = {2:78, 4:63} df['vals'] = df['Foo'].map(update_map).fillna(df['vals'])
方法2:修正update()的使用方式
update()是按索引匹配更新的,之前的错误在于未让更新用的DataFrame与原DataFrame索引对齐,且无需包含Foo列。正确写法如下:
import pandas as pd df = pd.DataFrame({'Foo': range(5), 'Bar': list('abcde'), 'vals': range(5)}) # 创建更新用的DataFrame,索引对应原DataFrame中Foo=2和4的行索引 update_df = pd.DataFrame({'vals': [78, 63]}, index=[2,4]) df.update(update_df) print(df)
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

