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