Python 如果满足单独单元格上的条件,则用另一个单元格替换单元格中的内容
我必须遵循数据帧Python 如果满足单独单元格上的条件,则用另一个单元格替换单元格中的内容,python,pandas,Python,Pandas,我必须遵循数据帧 A = [1,2,5,4,3,1] B = ["yes","No","hello","yes","no", 'why'] C = [1,0,1,1,0,0] D = ['y','n','y','y','n','n'] test_df = pd.DataFrame({'A': A, 'B': B, 'C': C, 'D':D}) 我们可以看到4列A、B、C、D。如果满足C上的条件
A = [1,2,5,4,3,1]
B = ["yes","No","hello","yes","no", 'why']
C = [1,0,1,1,0,0]
D = ['y','n','y','y','n','n']
test_df = pd.DataFrame({'A': A, 'B': B, 'C': C, 'D':D})
我们可以看到4列A、B、C、D。如果满足C上的条件,则预期结果是将B的内容替换为D的内容,例如,条件为C=1
预期输出为
A = [1,2,5,4,3,1]
B = ["y","No","y","y","no", 'why']
C = [1,0,1,1,0,0]
D = ['y','n','y','y','n','n']
output_df = pd.DataFrame({'A': A, 'B': B, 'C': C, 'D':D})
output_df.drop('D', axis = 1)
将此逻辑应用于数据帧的最佳方法是什么?这可以通过
np来完成。其中:
test_df['B'] = np.where(test_df['C']==1, test_df['D'], test_df['B'])
输出:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
In [875]: test_df
Out[875]:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
使用列“C”作为掩码的.loc
实现所需输出
test_df.loc[test_df['C']==1,'B'] = test_df.loc[test_df['C']==1,'D']
更新:刚刚发现@QuangHoang发布了一个类似的答案。这个答案稍有不同,因为它不需要numpy
有很多方法可以解决,下面是另一种方法:
test_df['B'] = test_df['B'].mask(test_df['C'] == 1, test_df['D'])
输出:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
In [875]: test_df
Out[875]:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
我不知道这里的inverse
是否正确,但我最近注意到mask
和where
是彼此的“反向”。如果将~
传递给语句的条件
。其中
语句,则得到与掩码
相同的结果:
A = [1,2,5,4,3,1]
B = ["yes","No","hello","yes","no", 'why']
C = [1,0,1,1,0,0]
D = ['y','n','y','y','n','n']
test_df = pd.DataFrame({'A': A, 'B': B, 'C': C, 'D':D})
test_df['B'] = test_df['B'].where(~(test_df['C'] == 1), test_df['D'])
# test_df['B'] = test_df['B'].mask(test_df['C'] == 1, test_df['D']) - Scott Boston's answer
test_df
Out[1]:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
您还可以使用:
输出:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
In [875]: test_df
Out[875]:
A B C D
0 1 y 1 y
1 2 No 0 n
2 5 y 1 y
3 4 y 1 y
4 3 no 0 n
5 1 why 0 n
直到今天才意识到熊猫有一个面具操作员!也使操作更具可读性