我有一个数据框C
和另一个数据框S
。如果C
和C
中的两列具有相同的值,我想更改S
列中某个值的值。
请考虑下面给出的例子,
C.head(3)
id1 id2 title val
0 1 0 'abc' 0
1 2 0 'bcd' 0
2 3 0 'efg' 0
S.head(3)
id1 id2
0 1 1
1 3 0
我想将值1分配给C中的列'val',仅对应于C.id1 = S.id1和C.id2 = S.id2
的行(C.id1,C.id2)和(S.id1,S.id2)的组合在各自的表格中是唯一的
在上面的例子中,我希望结果为
C.head(3)
id1 id2 title val
0 1 0 'abc' 0
1 2 0 'bcd' 0
2 3 0 'efg' 1
仅在C
的第三行中,与列S
和id1
的{{1}}行之一匹配。
答案 0 :(得分:1)
我认为需要merge
左连接和参数indicator
,最后将boolen mask转换为0
和1
:
#if same columns for join in both df parameter on is possible omit
df = C.merge(S, indicator=True, how='left')
#if multiple same columns in both df
#df = C.merge(S, indicator=True, how='left', on=['id1', 'id2'])
df['val'] = (df['_merge'] == 'both').astype(int)
df = df.drop('_merge', axis=1)
print (df)
id1 id2 val
0 1 0 0
1 2 0 0
2 3 0 1
解决方案适用于新数据:
df = C.merge(S, indicator=True, how='left')
#if multiple same columns in both df
#df = C.merge(S, indicator=True, how='left', on=['id1', 'id2'])
df['val'] = (df['_merge'] == 'both').astype(int)
df = df.drop('_merge', axis=1)
print (df)
id1 id2 title val
0 1 0 abc 0
1 2 0 bcd 0
2 3 0 efg 1