我必须遵循数据框
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)
将此逻辑应用于数据帧的最佳方法是什么?
答案 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
在这里是否是正确的词,但最近我注意到mask
和where
是彼此“相反”的。如果将~
传递给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