Как изменить значения в столбце фрейма данных pandas на основе условия в Python

#python #pandas

Вопрос:

Я хотел изменить значение своей строки, где, если бы в столбце «Состояние» было значение «ОТМЕНЕНО», это изменило бы значение строки из столбца «Активность» на «Отменено».

Это должно быть так:

ID Активность государство
1 созданный отмененный
1 Завершено отмененный
2 созданный ОТДЕЛАННЫЙ
2 Завершено ЗАКОНЧЕННЫЕ
3 созданный отклоненный
3 отклоненный отклоненный

то, что я устал использовать df.loc[df.state == "CANCELLED", "Activity"] = "cancelled"

Это действительно изменило действие, но я все еще хотел, чтобы созданное действие было таким же.

Там также есть ошибка

 C:Usersaldevminiconda3libsite-packagespandascoreindexing.py:1720: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self._setitem_single_column(loc, value, pi)
 

Если у кого-нибудь есть ответ, заранее благодарю вас

Комментарии:

1. Вы хотите сказать, что хотите, чтобы изменились только некоторые ОТМЕНЕННЫЕ действия? «завершено» должно измениться, но» создано » не должно? Есть ли другие условия?

2. Сообщение об ошибке, вероятно, связано с некоторым кодом перед строкой df.loc…, которой вы делитесь, где у вас есть что-то вроде df = df2. Если вы хотите скопировать фрейм данных, вы должны написать его явно, например, df = df2.copy()

3. Это было полное сообщение об ошибке? Обычно они показывают строку в вашем коде, которая не удалась.

4. Это предупреждение, а не ошибка. Вы можете прочитать больше об этом по ссылке, которая показана в заявлении об уменьшении. Также вы можете посмотреть его SettingWithCopyWarning .

5. @tdelaney Да, это так, он должен изменять действие «завершено» только в том случае, если состояние «отменено», и никаких других условий нет. похоже, я не понял предупреждение, других ошибок нет, только это предупреждение

Ответ №1:

Нам нужно найти строки, в которых состояние = «отменено». Мы можем использовать .loc(row, column) оператор для выбора записей, в которых состояние = «отменено», и возврата столбца «Активность», затем мы просто заменим эти значения на «отменено».

 import pandas as pd

data = {"ID": [1, 1, 2, 2, 3, 3], "Activity": ['created', 'completed', 'created', 'completed', 'created',
                                               'rejected'], "state": ['cancelled', 'cancelled', 'finished', 'finished', 'rejected', 'rejected']}
df = pd.DataFrame(data)
df.loc[df['state'] == 'cancelled', 'Activity'] = 'cancelled'


print(df)
 
ID Активность Государство
1 отмененный отмененный
1 отмененный отмененный
2 созданный ЗАКОНЧЕННЫЕ
2 Завершено ЗАКОНЧЕННЫЕ
3 созданный отклоненный
3 отклоненный отклоненный

Ответ №2:

 df.loc[(df.state == "CANCELLED") amp; (df.Activity != "created"), "Activity"] = "cancelled"
 

Код был пропущен () , в (df.state == "CANCELLED")