Группа панд к тому времени подает предупреждение - PullRequest
1 голос
/ 14 мая 2019

У меня есть строки кода

df = df.groupby(by=['col_A','col_B'])['float_col_c']
df.loc[:,'amount_cumulative'] = df.apply(lambda x: x.cumsum())

, который выдает предупреждение:

/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:362: 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: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[key] = _infer_fill_value(value)
/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:543: 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: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s

Обычно, когда я вижу эту ошибку, я могу изменить что-то на .loc[] наисправить это, но в этом случае предупреждение, похоже, относится к другой проблеме.Я знаю, что могу просто подавить предупреждение, но лучше понять проблему, которую я создаю с помощью синтаксиса Pandas.Мы очень ценим любые предложения о том, как исправить этот синтаксис.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Скорее всего, ваш df уже является копией другого фрейма данных. И ваше имя df_rev_melt_trim также предполагает это. Тест

old_df = pd.DataFrame({'A':np.random.randint(1,10,1000),
                   'B':np.random.randint(1,10,1000),
                   'C':np.random.uniform(0,1,1000)})

df = old_df[old_df['A'] > 5]

df['amount_cumulative'] = df.groupby(by=['A','B'])['C'].cumsum()

выдает то же предупреждение. Вместо этого вы можете сделать:

old_df.loc[df.index,'amount_cumulative'] = df.groupby(by=['A','B'])['C'].cumsum()

и предупреждения не отображаются.

2 голосов
/ 14 мая 2019

Я полагаю, это из-за индексации .loc[:, 'amount_cumulative'], которая возвращает фрагмент df, а не ссылку на новый столбец

Обновление: df была самой копией, как правильно указал @QuangHoang, и в этом случае следующее все равно выдаст ошибку.

Вы можете получить ожидаемый результат без предупреждения с помощью чего-то простого:

df['amount_cumulative'] = df.groupby(['col_A','col_B'])['float_col_c'].cumsum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...