Python: SettingWithCopyWarning при попытке установить значение True в зависимости от условия - PullRequest
2 голосов
/ 16 марта 2020

Данные:

Date          Stock    Peak    Trough    Price
2002-01-01    33.78    False   False     25
2002-01-02    34.19    False   False     35
2002-01-03    35.44    False   False     33
2002-01-04    36.75    False   False     38

Я использую эту строку кода, чтобы установить для пика значение true в каждой строке всякий раз, когда цена акции выше или равна максимальному значению в строке, начиная со столбца 4:

df['Peak'] = np.where(df.iloc[:,4:].max(axis=1) >= df[stock], 'False', 'True')

Однако я пытаюсь сделать так, чтобы первые X и последние Y строки не были затронуты. Скажем, X и Y оба 10 в этом примере. Я изменил это так:

df.iloc[10:-10]['Peak'] = np.where(df.iloc[10:-10,4:].max(axis=1) >= df.iloc[10:-10][stock], 'False', 'True')

Это дает мне ошибку SettingWithCopyWarning, а также больше не работает. У кого-нибудь есть идеи, как получить желаемый результат, чтобы первые X и последние Y строки всегда были ложными?

1 Ответ

3 голосов
/ 16 марта 2020

Я полагаю, что вам нужно get_loc для указания индекса столбца при назначении с помощью df.iloc[]:

df.iloc[10:,df.columns.get_loc('year')] = (np.where(df.iloc[10:,4:].max(axis=1)
                           >= df.iloc[10:,df.columns.get_loc('stock')],'False', 'True'))

Чтобы попробовать вот такой тестовый пример:

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,100,(5,4)),columns=list('ABCD'))
print(df)

    A   B   C   D
0  66  92  98  17
1  83  57  86  97
2  96  47  73  32
3  46  96  25  83
4  78  36  96  80

При попытке установить столбец D как np.nan из индекса 2 мы получаем ту же ошибку:

df.iloc[2:]['D']=np.nan

Значение пытается быть установлено для копии среза из DataFrame , Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение

См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning -a-view-vers-a-copy"" "Точка входа для запуск ядра I Python.

Попытка сделать то же самое, избегая цепочечного назначения с использованием get_loc ( успешно )

df.iloc[2:,df.columns.get_loc('D')] = np.nan
print(df)
    A   B   C     D
0  66  92  98  17.0
1  83  57  86  97.0
2  96  47  73   NaN
3  46  96  25   NaN
4  78  36  96   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...