Обновить строки данных в рамке цикла - PullRequest
0 голосов
/ 31 марта 2020

У меня есть фрейм данных, и я хочу создать несколько новых столбцов, которые содержат рост исходных столбцов.

Сначала я добавляю новые столбцы к фрейму данных, заполняя их значениями NaN.

Затем для каждой строки я проверяю, соответствует ли предыдущая строка предыдущему году и соответствует ли она Я хочу заполнить новый столбец с ростом переменной. В противном случае я просто оставляю значение NaN.

Вот мой код:

for index, row in df.iterrows():
   if df.loc[index,'year'] == df.loc[index - 1, 'year'] + 1 and df.loc[index,'name'] == df.loc[index - 1, 'name']:
       df.loc[index,k:] = (df.loc[index,1:k-1]/df.loc[index-1,1:k-1]) - 1

Где k - индекс столбца первого нового столбца «роста», который я создал.

Проблема с этим кодом состоит в том, что он оставляет новые столбцы со значениями NaN, не внося никаких изменений. Я сделал что-то не так?

Спасибо

1 Ответ

0 голосов
/ 31 марта 2020
df.sort_values('year', inplace = True)
growth_cols = [<your-growth-cols>]
new_cols = [x + "_growth" for x in growth_cols]
growth_df = df[growth_cols] / df[growth_cols].shift(1)
growth_df.rename(columns = dict(zip(growth_cols, new_cols)), inplace = True)
df = pd.concat([df, growth_df], axis =1)
df['gap'] = df.year.diff()
for col in new_cols:
    df[col] = df[col] * df['gap']
    df[col].replace(0, np.nan, inplace = True)
df.drop('gap', axis = 1, inplace = True)

РЕДАКТИРОВАТЬ (на основе обновленного вопроса):

Вам необходимо изменить строку

df['gap'] = df.year.diff()

на:

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