
在数据分析和处理中,我们经常需要根据一个dataframe中的数据来更新另一个dataframe中的特定行和列。例如,我们可能有一个主数据集df1,以及一个包含更新值和匹配键的辅助数据集df2。目标是根据df2中存在的键来更新df1中对应行的某一列,同时保留df1中不匹配行的原始值。
考虑以下两个Pandas DataFrame:
import pandas as pd
df1 = pd.DataFrame({'a':(1,2,3,4),'b':(10,20,30,40),'c':(100,200,300,400)})
df2 = pd.DataFrame({'a':(1,2,3),'b':(10,20,30),'c':(1111,2222,3333)})
print("df1:\n", df1)
print("\ndf2:\n", df2)输出:
df1: a b c 0 1 10 100 1 2 20 200 2 3 30 300 3 4 40 400 df2: a b c 0 1 10 1111 1 2 20 2222 2 3 30 3333
我们的目标是根据df2中'a'和'b'列的组合,更新df1中对应行的'c'列值。对于df1中那些在df2中找不到匹配的行,其'c'列应保持不变。期望的df1结果如下:
a b c 0 1 10 1111 1 2 20 2222 2 3 30 3333 3 4 40 400
许多初学者可能会尝试使用链式索引和set_index来解决这个问题,例如:
# 错误尝试
df1.set_index(['a', 'b']).loc[df2.set_index(['a', 'b']).index, 'c'] = df2.c
print("错误尝试后的df1:\n", df1)这种尝试的输出结果会是原始的df1,没有任何改变:
错误尝试后的df1: a b c 0 1 10 100 1 2 20 200 2 3 30 300 3 4 40 400
原因分析: 这种操作失败的原因在于df1.set_index(['a', 'b'])会创建一个新的DataFrame(或其副本),而不是返回原始df1的视图。因此,对这个新创建的DataFrame进行的赋值操作,并不会反映到原始的df1上。这是Pandas中一个常见的“链式赋值”问题,通常会导致预期的修改丢失。
当需要生成一个新的DataFrame作为更新结果,或者df1具有默认的整数范围索引时,merge与combine_first的组合是一种简洁而有效的方法。
原理:
# 解决方案一:使用 merge 和 combine_first
# 注意:此方法会创建一个新的DataFrame作为结果
out_df = df1[['a', 'b']].merge(df2, on=['a', 'b'], how='left').combine_first(df1)
print("使用merge和combine_first后的结果:\n", out_df)输出:
使用merge和combine_first后的结果: a b c 0 1 10 1111.0 1 2 20 2222.0 2 3 30 3333.0 3 4 40 400.0
注意事项:
当需要直接在df1上进行原地修改,或者df1具有非默认索引时,可以采用merge、reset_index、set_index和fillna的组合。
原理:
# 解决方案二:实现原地更新
# 为了避免链式赋值问题,我们创建一个新的列,然后将其赋值回df1的'c'列
df1['c'] = (df1[['a', 'b']].reset_index()
.merge(df2, on=['a', 'b'], how='left')
.set_index('index')['c']
.fillna(df1['c'])
)
print("原地更新后的df1:\n", df1)输出:
原地更新后的df1: a b c 0 1 10 1111.0 1 2 20 2222.0 2 3 30 3333.0 3 4 40 400.0
注意事项:
在Pandas中更新DataFrame的子集行值时,理解Pandas操作是返回视图还是副本至关重要,以避免链式赋值带来的常见陷阱。merge和combine_first组合提供了一种创建新DataFrame的优雅方式,而结合reset_index、merge、set_index和fillna则能实现高效且灵活的原地更新,适用于更复杂的索引情况。根据具体需求和数据特点选择最合适的策略,能够显著提高数据处理的效率和代码的健壮性。
以上就是Pandas教程:高效更新DataFrame子集行值的方法详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号