当我想替换满足条件的特定值并根据另一个条件替换值时,我遇到了麻烦。
Gender Surname Ticket
` 0 masc Family1 a12`
` 1 **fem NoGroup aa3**`
` 2 boy Family1 125`
` 3 **fem Family2 aa3**`
` 4 fem Family4 525`
` 5 masc NoGroup a52`
在df ['Surname']列的所有行中替换de值的条件是:
if ((df['Gender']!= masc) & (df['Surname'] == 'NoGroup'))
代码必须搜索票证相等的行并替换对应的Surname值,否则保留已存在的值(“ noGroup”)。
在此示例中,第1行('noGroup')中的['Surname']值应替换为与第3行相对应的'family2'。
我尝试过这种方法,但是没有用
for i in zip((df['Gender']!='man') & df['Surname']=='noGroup'):
df['Surname'][i] = df.loc[df['Ticket']==df['Surname'][i]]
答案 0 :(得分:1)
对于Pandas,您应该针对矢量化计算而不是逐行循环。这是一种方法。首先将选定的值转换为None
:
df.loc[df['Gender'].ne('masc') & df['Surname'].eq('NoGroup'), 'Surname'] = None
然后在过滤器之后创建从Ticket
到Surname
的系列映射:
s = df[df['Surname'].notnull()].drop_duplicates('Ticket').set_index('Ticket')['Surname']
最后,将空值与计算所得的序列映射:
df['Surname'] = df['Surname'].fillna(df['Ticket'].map(s))
结果:
Gender Surname Ticket
0 masc Family1 a12
1 fem Family2 aa3
2 boy Family1 125
3 fem Family2 aa3
4 fem Family4 525
5 masc NoGroup a52