python - 使用另一个数据帧同一列中的值更新数据帧中的列

标签 python pandas

我有一个较大的数据帧,其中有一列我想用较小数据帧中的新值进行更新,仅当另一列的行值匹配时。左连接具有正确的行,但有两列我想要“更新”的值(左和右)。我尝试过使用 drop 进行左合并,但当然,这会清除我试图在匹配列不匹配的地方更新的列中的值。我也尝试过以下变体:

tips.loc[tips['tip'] < 2, 'tip'] = 2

但我收到有关需要匹配的系列长度的错误,因为我更新的表较小。我也查看了 DataFrame.combine_first() ,但文档没有显示它需要任何选项,也没有产生我正在寻找的东西。

这是一个例子:

df = pd.DataFrame({'CAT': ['A', 'B', 'C', 'D', 'E'], 'Value': [12, 34, np.NaN, 43, 21]})
  CAT  Value
0   A     12
1   B     34
2   C    NaN
3   D     43
4   E     21

df2 = pd.DataFrame({'CAT': ['C', 'F', 'G'], 'Value': [22, 99, 44]})
  CAT  Value
0   C     22
1   F     99
2   G     44

结果应该是这样的:

 CAT  Value
0   A     12
1   B     34
2   C     22
3   D     43
4   E     21

虽然此示例中的左框架已更新 NaN​​,但我并不是专门针对这种情况。我想覆盖那里的任何值。有什么帮助吗?谢谢。

最佳答案

看起来您想要将 df 中的 Value 替换为 df2 中相应的 Value,如果值(value)存在。即,假设您有一个 CAT F,其在 df 中的对应值为 36,您会希望将其替换为 99(来自df2)。

使用合并:

df= df.merge(df2, on = 'CAT', how = 'left')
df['Value'] = df[['Value_x', 'Value_y']].apply(lambda x: np.where(df['Value_y'].isna(), df['Value_x'], df['Value_y'])).drop(columns = ['Value_y'])
df.drop(columns = ['Value_x', 'Value_y'])

输出:

  CAT  Value
0   A   12.0
1   B   34.0
2   C   22.0
3   D   43.0
4   E   21.0
5   F   99.0

关于python - 使用另一个数据帧同一列中的值更新数据帧中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52581676/

相关文章:

python - 在 r 中使用 igraph 导出图形

python - 在 Python 中对句子进行分词并重新连接结果

python - 有没有开源工具可以自动为遗留代码生成测试用例?

python - 在保留所有列的 Pandas 中获取每个类别的前 n 个值

python - Pandas:删除并计算有条件的连续重复项

python - pandas astype python bool 而不是 numpy.bool_

python - 查找 Pandas DataFrame 中不属于某种类型的所有值

python - 带有补丁的单元测试行为(Flask)

c++ - 使用 OpenCV(基于霍夫变换或其他功能)编写稳健(颜色和大小不变)的圆检测

python - 使用 python 在我的数据上拟合高斯分布(或其他分布)