#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")