使用另一个DataFrame的Series映射多个列

3

我有两个数据框。 我需要的是用df2 ['SC']中的值替换df1中列BCD中的文本,基于df2 ['Title']的值。

df1

A     B      C      D
Dave  Green  Blue   Yellow
Pete  Red
Phil  Purple

df2

  A     ID   N    SC     Title
  Dave  1    5      2    Green
  Dave  1    10     2    Blue    
  Dave  1    15     3    Yellow
  Pete  2    100    3    Red
  Phil  3    200    4    Purple

Desired output:

 A     B     C      D    
 Dave  2     2     3
 Pete  3
 Phil  4

同时也匹配'A'吗?如果Dave和Phil都是“Green”,会发生什么,还是这永远不可能发生? - ALollz
@ALollz 这是一个很好的观点,我忘了提到...实际上,我认为下面的解决方案只是将该问题标记为“InvalidIndexError:仅在具有唯一值索引对象的情况下才有效的重新索引”。 - C_psy
1个回答

3
使用 stack + map + unstack
df1.set_index('A').stack().map(df2.set_index('Title')['SC']).unstack()

        B    C    D
A
Dave  2.0  2.0  3.0
Pete  3.0  NaN  NaN
Phil  4.0  NaN  NaN

如果一个列包含全部NaN,那么它将会被删除。为了避免这种情况,你可以使用reindex方法。

.reindex(df1.columns, axis=1)             # append to previous command

我意识到“Title”不一定是唯一的名称(A), 这可能会导致以下问题 - “InvalidIndexError:只有具有唯一值索引对象才有效重新索引 - SC将始终与Title匹配,但是它们可能会出现多次针对A中的不同值。 - C_psy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接