在特定列上更新熊猫

Posted

技术标签:

【中文标题】在特定列上更新熊猫【英文标题】:Update in pandas on specific columns 【发布时间】:2016-03-26 11:41:49 【问题描述】:

我想根据另一个数据帧中的值更新一个pandas 数据帧中的值,但我想指定要更新的列(即,哪一列应该是查找匹配行的“键”) .现在它似乎确实将第一列视为关键。有没有办法给它传递一个特定的列名?

例子:

import pandas as pd
import numpy as np

df_a = pd.DataFrame()
df_a['x'] = range(5)
df_a['y'] = range(4, -1, -1)
df_a['z'] = np.random.rand(5)

df_b = pd.DataFrame()
df_b['x'] = range(5)
df_b['y'] = range(5)
df_b['z'] = range(5)


print('df_b:')
print(df_b.head())
print('\nold df_a:')
print(df_a.head(10))

df_a.update(df_b)

print('\nnew df_a:')
print(df_a.head())

输出:

df_b:
   x  y  z
0  0  0  0
1  1  1  1
2  2  2  2
3  3  3  3
4  4  4  4

old df_a:
   x  y         z
0  0  4  0.333648
1  1  3  0.683656
2  2  2  0.605688
3  3  1  0.816556
4  4  0  0.360798

new df_a:
   x  y  z
0  0  0  0
1  1  1  1
2  2  2  2
3  3  3  3
4  4  4  4

你看,它所做的是将df_a 中的yz 替换为df_b 中的相应列,基于xdf_adf_b 之间的匹配。

如果我想保持y 不变怎么办?如果我希望它基于y 而不是x 替换怎么办。此外,如果有多个列我想进行替换(在真正的问题中,我必须使用新数据集更新数据集,其中两列或三列之间存在匹配项第四列的值)。

基本上,我想做某种合并-替换操作,在其中指定要合并/替换 on 的列以及应替换的列。

希望这能让事情更清楚。如果这不能用pandas 中的update 完成,我想知道是否还有另一种方法(没有为它编写一个带有for 循环的单独函数)。

【问题讨论】:

拜托,伙计,如果有人不知道你在做什么,你认为他们有足够的信息可以提供帮助吗? 添加了示例代码和输出。 【参考方案1】:

这是我目前的解决方案,但似乎有些不雅:

df_merge = df_a.merge(df_b, on='y', how='left', suffixes=('_a', '_b'))
print(df_merge.head())

df_merge['x'] = df_merge.x_b
df_merge['z'] = df_merge.z_b

df_update = df_a.copy()
df_update.update(df_merge)
print(df_update)

输出:

   x_a  y       z_a  x_b  z_b
0    0  0  0.505949    0    0
1    1  1  0.231265    1    1
2    2  2  0.241109    2    2
3    3  3  0.579765  NaN  NaN
4    4  4  0.172409  NaN  NaN
   x  y         z
0  0  0  0.000000
1  1  1  1.000000
2  2  2  2.000000
3  3  3  0.579765
4  4  4  0.172409
5  5  5  0.893562
6  6  6  0.638034
7  7  7  0.940911
8  8  8  0.998453
9  9  9  0.965866

【讨论】:

以上是关于在特定列上更新熊猫的主要内容,如果未能解决你的问题,请参考以下文章

如何更新python中熊猫数据框特定列中的所有行?

从前一行和特定列值有效地更新熊猫数据框中的 NaN

MySQL - 根据更新其他表列值触发更新列值

在特定 ID 列上合并两个 DataFrame(数据集)但具有日期条件

熊猫在一列上分组,另一列上的最大日期python

BEFORE UPDATE 触发器阻止所有更新