python-3.x - 用另一个值更新熊猫数据框的正确方法
问题描述
用另一个数据帧的值更新一个数据帧中的多个列的正确方法是什么?
假设我有这两个数据框:
import pandas as pd
df1 = pd.DataFrame([['4', 'val1', 'val2.4', 'val3.4'],
['5', 'val1', 'val2.5', 'val3.5'],
['6', 'val1', 'val2.6', 'val3.6'],
['7', 'val1', 'val2.7', 'val3.7']],
columns=['account_id', 'field1', 'field2', 'field3'])
df2 = pd.DataFrame([['6', 'VAL2.6', 'VAL3.6'],
['5', 'VAL2.5', 'VAL3.5']],
columns=['account_id', 'field2', 'field3'])
值得注意的是,df2 只有 d1 的行(以某种随机顺序)和列的子集。
我想用 df2 中的值替换 df1 中的值(它们存在的地方,加入 account_id,ala 一个 SQL UPDATE)。
一种解决方案是
cols_to_update = ['field2', 'field3']
df1.loc[df1.account_id.isin(df2.account_id), cols_to_update] = df2[cols_to_update].values
但这不能处理连接并导致
account_id field1 field2 field3
0 4 val1 val2.4 val3.4
1 5 val1 VAL2.6 VAL3.6
2 6 val1 VAL2.5 VAL3.5
3 7 val1 val2.7 val3.7
account_id 6 现在有错误的值。
我的问题是:
我如何使用索引来完成类似的工作?
有没有合并重复列时不那么乏味的 merge() 或 join() 解决方案?
解决方案
df2
在分配之前对值进行排序,即
cols_to_update = ['field2', 'field3']
df1.loc[df1.account_id.isin(df2.account_id), cols_to_update] = df2.sort_values(['account_id'])[cols_to_update].values
account_id field1 field2 field3
0 4 val1 val2.4 val3.4
1 5 val1 VAL2.5 VAL3.5
2 6 val1 VAL2.6 VAL3.6
3 7 val1 val2.7 val3.7
推荐阅读
- c# - 如何从 Coypu 获取 Selenium IWebDriver 和 IWebElement?
- ruby - 为什么 Struct/Class 实例的相等检查不同?
- ios - 手机锁定时如何从IOS上的网络应用程序连续播放音轨?
- javascript - 当按钮单击同一页面时,在引导模式中获取 id
- unity3d - Unity:双击按钮时如何制作定向破折号
- c# - 如何在布局中包装视图
在 Xamarin 表单中使用 DataTemplate 的控件 - amazon-web-services - Amazon EC2 和 Amazon Redshift 之间的关系
- bash - 为什么我的文本文件显示我的所有字段都等于只有一个字段?
- mysql - Laravel 测试功能以查看数据库中的任何更改
- python - 如何在没有for循环的情况下通过多个索引获取/设置numpy矩阵中的元素?