2016-11-18 13 views
0

Я пытаюсь заменить все значения в колонке панды dataframe df.column_A, если они находятся в пределах диапазона от 1 до 10.Как изменить конкретные значения ячеек в серии столбцов dataframe pandas на основе нескольких условий?

Однако, когда я делаю:

df.loc[(1 < df.column_A < 10), "Column_A"] = 1,

Я получаю:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

С другой стороны, когда я делаю:

df.loc[(df.column_A < 10) & (df.column_A > 1), "df.column_A"] = 1,

Я не имею получая ошибок нет вообще, но значения не заменяются.

Странно, что когда я делаю:

df.loc[(df.column_A < 10) | (df.column_A > 1), "df.column_A"] = 1,

все значения в df.column_A заменяются с 1, как я бы ожидать.

Это означает, что синтаксис строки правильный, поэтому ошибка должна быть связана с некоторыми факторами, которые я не понимаю.

Что я делаю неправильно?

ответ

1

Это простая проблема. .loc принимает индексные метки или логический список/ряды. Так что это будет работать:

df.loc[(df.column_A < 10) & (df.column_A > 1), "column_A"] = 1 

Обратите внимание, что я удалил df. из индексного столбца места.


df.loc[(1 < df.column_A < 10), "Column_A"] = 1 

не будет работать, потому что операция (1 < df.column_A < 10) кажется логичным, но пытается свернуть всю серию в одно значение. И поскольку он не знает, хотите ли вы and, or или какую-то другую комбинацию, это вызывает эту ошибку.

df.loc[(df.column_A < 10) | (df.column_A > 1), "df.column_A"] = 1 

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