Python 如果为True,则保留列值,否则为False

Python 如果为True,则保留列值,否则为False,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有这样一个数据帧: df = pd.DataFrame({'name':['John Doe', 'Jack Bauer???', 'Chris Smith'], 'flag':['True', 'False', 'True]})[['name', 'flag']] 如您所见,第一个和第三个名称的格式正确,但第二个名称的文本不正确。我想要一个新的列(或“名称”上方的替代列),如下所示: 'name': 'John Doe' False 'Chris Smith' 在熊猫

假设我有这样一个数据帧:

df = pd.DataFrame({'name':['John Doe', 'Jack Bauer???', 'Chris Smith'],
        'flag':['True', 'False', 'True]})[['name', 'flag']]
如您所见,第一个和第三个名称的格式正确,但第二个名称的文本不正确。我想要一个新的列(或“名称”上方的替代列),如下所示:

'name':
'John Doe'
False
'Chris Smith'
在熊猫身上获得这种理想效果的最佳方法是什么?我正在努力使用口罩,并申请让它发挥作用

我认为您需要:

如果需要更换列
名称

df['name'] = df.name.mask(df.flag=='False', False)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df['flag'] = df.flag.replace({'True': True, 'False': False})
df['name'] = df.name.mask(~df.flag, False)
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df.loc[df.flag=='False', 'name'] = False
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
如果字符串
True
False
为布尔值:

df['flag'] = df.flag.replace({'True': True, 'False': False})

df['new'] = df.name.mask(~df.flag, False)
print (df)
            name   flag          new
0       John Doe   True     John Doe
1  Jack Bauer???  False        False
2    Chris Smith   True  Chris Smith
替换
名称

df['name'] = df.name.mask(df.flag=='False', False)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df['flag'] = df.flag.replace({'True': True, 'False': False})
df['name'] = df.name.mask(~df.flag, False)
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df.loc[df.flag=='False', 'name'] = False
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
另一个解决方案包括:

替换
名称

df['name'] = df.name.mask(df.flag=='False', False)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df['flag'] = df.flag.replace({'True': True, 'False': False})
df['name'] = df.name.mask(~df.flag, False)
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True
df.loc[df.flag=='False', 'name'] = False
print (df)
          name   flag
0     John Doe   True
1        False  False
2  Chris Smith   True

谢谢你详细而灵活的回答!很高兴能帮助你!