如何在熊猫中使用具有相似特征条件的值替换特定行(基于条件)?

时间:2018-10-04 23:18:44

标签: python pandas

当我想替换满足条件的特定值并根据另一个条件替换值时,我遇到了麻烦。

数据帧(df)的示例

     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]]

1 个答案:

答案 0 :(得分:1)

对于Pandas,您应该针对矢量化计算而不是逐行循环。这是一种方法。首先将选定的值转换为None

df.loc[df['Gender'].ne('masc') & df['Surname'].eq('NoGroup'), 'Surname'] = None

然后在过滤器之后创建从TicketSurname的系列映射:

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