根据另一列中的值替换DataFrame列中的值

时间:2019-01-20 19:01:52

标签: python pandas dataframe

要尝试,我有:

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替换最后一列中的值。

例如,查看前三行:

enter image description here

因此,由于'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()]))

但它没有任何改变。

3 个答案:

答案 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']
相关问题