Как использовать .loc для установки других значений столбца в пандах - PullRequest
0 голосов
/ 09 ноября 2018

Например, у меня есть фрейм данных:

    cond  value1  value2
0   True       1       1
1  False       3       5
2   True      34       2
3   True      23      23
4  False       4       2

Я надеюсь заменить value1 на value2*2, когда cond=True. Итак, я хочу, чтобы результат:

    cond  value1  value2
0   True       2       1
1  False       3       5
2   True       4       2
3   True      46      23
4  False       4       2

Я могу добиться этого, следуя коду:

 def convert(x):
     if x.cond:
         x.value1= x.value2*2
     return x
 data = data.apply(lambda x: convert(x),axis=1)

Я думаю, что это очень медленно, когда данные большие. Я пробую это по .loc, но я не знаю, как установить значение.

Как мне добиться этого с помощью .loc или другими простыми способами? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Вы можете использовать where / mask:

df.value1 = df.value1.mask(df.cond, df.value2*2)
# Or,
# df.value1 = df.value1.where(~df.cond, df.value2*2)

print(df)
    cond  value1  value2
0   True       2       1
1  False       3       5
2   True       4       2
3   True      46      23
4  False       4       2
0 голосов
/ 09 ноября 2018

Использование np.where:

df['value1'] = np.where(df.cond,df.value2*2,df.value1)

print(df)
    cond  value1  value2
0   True       2       1
1  False       3       5
2   True       4       2
3   True      46      23
4  False       4       2
0 голосов
/ 09 ноября 2018

Создание логической маски и нескольких только отфильтрованных строк:

mask = df.cond
df.loc[mask, 'value1'] =  df.loc[mask, 'value2'] * 2
print (df)
    cond  value1  value2
0   True       2       1
1  False       3       5
2   True       4       2
3   True      46      23
4  False       4       2
...