обновить столбец панды значениями другого столбца, используя .loc - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно условно обновить ColY ниже, если значение для ColX! = 0. Отличие от других примеров заключается в том, что мне нужно заменить ColY на значения из ColX, а не на строку

Я могу заменить на строку, используя .loc, когда я использую следующий код:

df1.loc[df1.ColX != 0, 'ColY'] = 'Example'

Как заменить соответствующие значения ColY значениями из ColX? Я пробовал такие вещи, как ниже, но безрезультатно

df1.loc[df1.ColX != 0, 'ColY'] = df1.ColX

Мой исходный фрейм данных, df1:

ID  ColX   ColY
A   2024   0
B   0      2023
C   2019   0
D   2023   2024

Мой желаемый вывод:

ID  ColX   ColY
A   2024   2024
B   0      2023
C   2019   2019
D   2023   2023

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Просто для вашего удобства, вот еще один очиститель метод, на мой взгляд, с использованием np.where и .ne:

df['ColY'] = np.where(df['ColX'].ne(0), df['ColX'], df['ColY'])

print(df)
  ID  ColX  ColY
0  A  2024  2024
1  B     0  2023
2  C  2019  2019
3  D  2023  2023
1 голос
/ 03 апреля 2019

Проблема с df1.loc[df1.ColX != 0, 'ColY'] = df1.ColX заключается в том, что вы пытаетесь заменить подмножество df1.ColY (т.е. где df1.ColX != 0) на все df1.ColX, которое имеет больше значений.

Чтобы условно скопировать правильные значения, вы также должны применить тот же фильтр к df1.ColX:

df1 = pd.DataFrame(data=[[2024, 0], [0, 2023], [2019, 0], [2023, 2023],], columns=['ColX', 'ColY'])

relevant_cols = (df1.ColX != 0)
df1.loc[relevant_cols, 'ColY'] = df1.loc[relevant_cols, 'ColX']
df1
#   ColX  ColY
# 0  2024  2024
# 1     0  2023
# 2  2019  2019
# 3  2023  2023
...