如果满足另一个单元格上的条件,则用另一个单元格替换单元格中的内容

时间:2020-10-18 03:57:29

标签: 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的条件,则预期结果是用D的内容替换B的内容,对于本示例,条件为C = 1 < / p>

预期的输出是

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)

将此逻辑应用于数据帧的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

有很多解决方法,这是另一种方法:

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

答案 1 :(得分:1)

这可以通过np.where完成:

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

答案 2 :(得分:1)

使用.loc(以“ C”列作为掩码)可以实现所需的输出。

test_df.loc[test_df['C']==1,'B'] = test_df.loc[test_df['C']==1,'D']

更新:@QuangHoang发布了一个类似的答案。该答案略有不同,因为它不需要numpy

答案 3 :(得分:0)

我不知道inverse在这里是否是正确的词,但最近我注意到maskwhere是彼此“相反”的。如果将~传递给condition语句的.where,则得到的结果与mask相同:

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

答案 4 :(得分:0)

您也可以使用df.where

test_df['B'] = test_df['D'].where(test_df.C.eq(1), test_df.B)

输出:

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
相关问题