Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas(Python)-使用条件和不同列从另一个数据帧更新数据帧的列_Python_Pandas - Fatal编程技术网

Pandas(Python)-使用条件和不同列从另一个数据帧更新数据帧的列

Pandas(Python)-使用条件和不同列从另一个数据帧更新数据帧的列,python,pandas,Python,Pandas,我遇到了一个问题,我找到了一个解决办法,但我觉得这是错误的做法。也许,有一种更为“规范”的方法可以做到这一点 我已经这样做了,但在这里,每个数据帧中的行数不尽相同。很抱歉“双贴”,但第一个仍然有效,所以我认为最好换一个新的 问题 我有两个数据帧,我想合并而不需要额外的列,也不需要删除现有的信息。例如: 现有数据帧(df) 要合并的数据帧(df2) 如果列“A”和“A2”对应,我想用df2更新df。 结果将是: A A2 B 0 1 4 2 <= Update valu

我遇到了一个问题,我找到了一个解决办法,但我觉得这是错误的做法。也许,有一种更为“规范”的方法可以做到这一点

我已经这样做了,但在这里,每个数据帧中的行数不尽相同。很抱歉“双贴”,但第一个仍然有效,所以我认为最好换一个新的

问题

我有两个数据帧,我想合并而不需要额外的列,也不需要删除现有的信息。例如:

现有数据帧(df)

要合并的数据帧(df2)

如果列“A”和“A2”对应,我想用
df2
更新
df
。 结果将是:

   A  A2    B
0  1   4  2 <= Update value ONLY
1  2   5  1
2  2   5  1
我尝试了这个解决方案:

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1)
df.loc[rows,'B'] = df2.loc[rows,'B']
但是我有这个错误,因为行数不对:

ValueError: Can only compare identically-labeled DataFrame objects
有人有更好的方法吗? 谢谢

我认为您可以使用来检查两个
数据帧中的相同行。然后创建
NaN
by,由填充。最后一次转换到
int

mask = df[['A', 'A2']].isin(df2[['A', 'A2']]).all(1)
print (mask)
0     True
1    False
2    False
dtype: bool

df.B = df.B.mask(mask).combine_first(df2.B).astype(int)
print (df)
   A  A2  B
0  1   4  2
1  2   5  1
2  2   5  1

在创建布尔掩码的方式上稍加调整,即可使其正常工作:

cols = ['A', 'A2']
# Slice it to match the shape of the other dataframe to compare elementwise
rows = (df[cols].values[:df2.shape[0]] == df2[cols].values).all(1)
df.loc[rows,'B'] = df2.loc[rows,'B']
df

谢谢!不太容易,但我会分析/学习/使用这个:D
ValueError: Can only compare identically-labeled DataFrame objects
mask = df[['A', 'A2']].isin(df2[['A', 'A2']]).all(1)
print (mask)
0     True
1    False
2    False
dtype: bool

df.B = df.B.mask(mask).combine_first(df2.B).astype(int)
print (df)
   A  A2  B
0  1   4  2
1  2   5  1
2  2   5  1
cols = ['A', 'A2']
# Slice it to match the shape of the other dataframe to compare elementwise
rows = (df[cols].values[:df2.shape[0]] == df2[cols].values).all(1)
df.loc[rows,'B'] = df2.loc[rows,'B']
df