Замена значений в столбце pandas кадра данных тем же значением строки из другого столбца - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть pandas фрейм данных, который выглядит следующим образом:

            val_1   val_2   Flag
Date                       
2018-08-27  221.0  121.0     0
2018-08-28  222.0  122.0     1
2018-08-29  223.0  123.0     0
2018-08-30  224.0  124.0     2
2018-08-31  225.0  125.0     0

Я хочу изменить значения столбца Flag на те же значения из других столбцов на основе условия Flag. А именно, если Flag равен 1, заменить 1 на val_1 из той же строки, а если Flag равен 2, заменить его на val_2. Вывод, который я смотрю, будет выглядеть так:

            val_1   val_2   Flag
Date                       
2018-08-27  221.0  121.0     0
2018-08-28  222.0  122.0     222.0
2018-08-29  223.0  123.0     0
2018-08-30  224.0  124.0     124.0
2018-08-31  225.0  125.0     0

Я знаю, что могу использовать .loc вот так df.loc[df['Flag'] == 1, ['Flag']] =. Я не знаю, что относится к правой части кода.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

Несколько способов сделать это, во-первых, ваш исходный код очень близок, вам просто нужно завершить присваивание:

df.loc[df['Flag'] == 1, 'Flag'] = df['val_1']
print(df)
         Date  val_1  val_2   Flag
0  2018-08-27  221.0  121.0    0.0
1  2018-08-28  222.0  122.0  222.0
2  2018-08-29  223.0  123.0    0.0
3  2018-08-30  224.0  124.0    2.0
4  2018-08-31  225.0  125.0    0.0

здесь вы фильтруете свой фрейм данных и заменяете значения, где условия совпадают. в этом случае, когда Flag равен единице.

, так как вы делаете многократные отборы, давайте использовать np.select

import numpy as np
conditions = [df['Flag'].eq(1),
             df['Flag'].eq(2)]


choices = [df['val_1'],df['val_2']]

df['Flag'] = np.select(conditions,choices,default=df['Flag'])

Что это делает, это оценивает любые условия, которые у вас есть , оставив значение по умолчанию в качестве исходного столбца. Вы можете добавить больше условий и заключить оператор OR в круглые скобки с помощью | (труба) сепараторы. т.е. [(df['Flag'] == 1 | df['Flag'] == 2)]

         Date  val_1  val_2   Flag
0  2018-08-27  221.0  121.0    0.0
1  2018-08-28  222.0  122.0  222.0
2  2018-08-29  223.0  123.0    0.0
3  2018-08-30  224.0  124.0  124.0
4  2018-08-31  225.0  125.0    0.0
3 голосов
/ 16 апреля 2020

IIU C:

new_vals = df.lookup(df.index, df.columns[df.Flag-1])

df['Flag'] = df.Flag.mask(df.Flag>0, new_val)

Примечание : как прокомментировал @Erfan, это также будет работать:

df['Flag'] = df.lookup(df.index, df.columns[df.Flag-1])

Вывод:

            val_1  val_2  Flag
Date                          
2018-08-27  221.0  121.0     0
2018-08-28  222.0  122.0   222
2018-08-29  223.0  123.0     0
2018-08-30  224.0  124.0   124
2018-08-31  225.0  125.0     0
2 голосов
/ 16 апреля 2020

Еще один способ - использовать np.where для numpy.where(condtion,yes,no)

. В этом случае я использую вложенный np.where, чтобы

np.where(If Flag=2,take val_2,(take x)) where takex is another np.where

df['Flag']=np.where(df['Flag']==1,df['val_1'],(np.where(df['Flag']==2,df['val_2'],df['Flag'])))
df

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...