SettingWithCopyWarning в пандах - PullRequest
       1

SettingWithCopyWarning в пандах

0 голосов
/ 07 июня 2018

У меня есть кадр данных, как показано ниже:

df = 
           index     P01  unten   oben     RV   R2_simu
2014-05-23 03:00:00  0.0    0.0    0.9    0.8         0
2014-05-23 06:00:00  0.5    0.7    1.4    0.1         0
2014-05-23 07:00:00  1.0    2.4    2.4    0.6         0
2014-05-23 08:00:00 0.55   15.7   28.0    0.3         0
....

, и я пытаюсь выполнить цикл:

for i in range(0, len(df)):

    if df.P01[i] >= df.RV[i]:
        df.R2_simu[i] = 0 

    elif df.P01[i] < df.RV[i]:
        df.R2_simu[i] = df.RV[i]
    else:
        pass

Я ожидаю получить новый кадр данных, как показано ниже,

df = 
           index     P01  unten   oben     RV   R2_simu
2014-05-23 03:00:00  0.0    0.0    0.9    0.8       0.8
2014-05-23 06:00:00  0.5    0.7    1.4    0.1         0
2014-05-23 07:00:00  1.0    2.4    2.4    0.6         0
2014-05-23 08:00:00 0.55   15.7   28.0    0.6       0.6

однако я получаю сообщение SettingWithCopyWarning , я пытаюсь переписать

 df.R2_simu[i] = df.RV[i]

в

 df.R2_simu[i] = df.RV[i].copy()

Но, похоже, проблема все еще существует.

Кто-нибудь знает, как с этим бороться?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Попробуйте установить значения в кадре данных с помощью индексации loc, это может быть причиной того, что внутренне создается копия df и записывается в нее.Измените ваш цикл на

for i in range(0, len(df)):

    if df.P01[i] >= df.RV[i]:
        df.loc[i,"R2_simu"] = 0 

    elif df.P01[i] < df.RV[i]:
        df.loc[i,"R2_simu"] = df.RV[i]
    else:
        pass

Еще лучше, если вы используете не цикл, а векторный доступ:

df.loc[df.loc[:,"P01"] >= df.loc[:,"RV"],"R2_simu"] = 0
df.loc[df.loc[:,"P01"] < df.loc[:,"RV"],"R2_simu"] = df.loc[df.loc[:,"P01"] < df.loc[:,"RV"],"RV"]

Объясняется изнутри наружу

df.loc[:, "col"] => взять каждую строку : и столбец col

df.loc[x1 >= x2, "R2_simu"] => Рассмотреть только те строки, где x1 >= x2 и столбец R2_simu

0 голосов
/ 07 июня 2018

SettingWithCopyWarning является распространенным побочным эффектом использования синтаксиса, подобного вашему:

df.R2_simu[i] = df.RV[i]

Разработчики рекомендовали использовать df.loc[] вместо использования индекса для доступа к элементам.Также обратите внимание, что использование for i in range(0, len(df)): менее распространено, чем использование df.iterrows или векторизованных функций.Например, это делает то же самое, что и часть вашего кода:

df['R2_simu'] = df['R2_simu'].apply(lambda row: 0 if row['P01'] >= row['RV']) # it's generally more common to use dict notation in pandas
OR # if you really like dot notation...
df.R2_simu = df.R2_simu.apply(lambda row: 0 if row.P01 >= row.RV)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...