要尝试,我有:
test = pd.DataFrame([[1,'A', 'B', 'A B r'], [0,'A', 'B', 'A A A'], [2,'B', 'C', 'B a c'], [1,'A', 'B', 's A B'], [1,'A', 'B', 'A'], [0,'B', 'C', 'x']])
replace = [['x', 'y', 'z'], ['r', 's', 't'], ['a', 'b', 'c']]
仅当replace
列表中与该行第一列中的数字相对应的位置上存在值时,我才想用0替换最后一列中的值。
例如,查看前三行:
因此,由于'r'位于replace[1]
中,因此该单元格变为A B 0
。
“ A”不在replace[0]
中,因此保持为A A A
,
'a'和'c'都在replace[2]
中,因此变成B 0 0
,
等
我尝试过类似的
test[3] = test[3].apply(lambda x: ' '.join([n if n not in replace[test[0]] else 0 for n in test.split()]))
但它没有任何改变。
答案 0 :(得分:3)
IIUC,使用zip
和列表理解来完成此任务。
我已经简化并创建了自定义replace_
函数,但是如果需要,可以随时使用regex
进行替换。
def replace_(st, reps):
for old,new in reps:
st = st.replace(old,new)
return st
df['new'] = [replace_(b, zip(replace[a], ['0']*3)) for a,b in zip(df[0], df[3])]
输出
0 1 2 3 new
0 1 A B A B r A B 0
1 0 A B A A A A A A
2 2 B C B a c B 0 0
3 1 A B s A B 0 A B
4 1 A B A A
5 0 B C x 0
答案 1 :(得分:2)
结合使用列表推导和集合查找:
test[3] = [' '.join('0' if i in set(replace[a]) else i for i in b.split())
for a,b in zip(test[0], test[3])]
print (test)
0 1 2 3
0 1 A B A B 0
1 0 A B A A A
2 2 B C B 0 0
3 1 A B 0 A B
4 1 A B A
5 0 B C 0
或先转换为集合以提高性能:
r = [set(x) for x in replace]
test[3]=[' '.join('0' if i in r[a] else i for i in b.split()) for a,b in zip(test[0], test[3])]
答案 2 :(得分:2)
最后我知道你需要什么
s=pd.Series(replace).reindex(test[0])
[ "".join([dict.fromkeys(y,'0').get(c, c) for c in x]) for x,y in zip(test[3],s)]
['A B 0', 'A A A', 'B 0 0', '0 A B', 'A', '0']