Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果满足单独单元格上的条件,则用另一个单元格替换单元格中的内容_Python_Pandas - Fatal编程技术网

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

直到今天才意识到熊猫有一个面具操作员!也使操作更具可读性