Как суммировать столбцы и добавлять результат в виде строки в одном и том же кадре данных? - PullRequest
3 голосов
/ 08 октября 2019

У меня есть кадр данных, подобный следующему:

|   int_col_1   ||   int_col2   ||   str_col3   ||   float_col4   ||   float_col5   |
|---------------||--------------||--------------||----------------||----------------|
|      123      ||      456     ||     potato   ||     0.1        ||       -0.2     |
|      456      ||      456     ||     potato   ||     0.1        ||        5.0     |
|      456      ||      456     ||     potato   ||     0.1        ||       -0.2     |
|      ...      ||      ...     ||     ...      ||     ...        ||       ...      |

Я хочу суммировать все строки float_col_4 и float_col5, которые выше 0 для разных int_col_1, и добавить результат в виде новой строки.

Итак, новый фрейм данных будет выглядеть следующим образом.

|   int_col_1   ||   int_col2   ||   str_col3   ||   float_col4   ||   float_col5   |
|---------------||--------------||--------------||----------------||----------------|
|      123      ||      789     ||     potato   ||     0.1        ||       -0.2     |
|      Total    ||     NULL     ||       NULL   ||     0.1        ||        0.0     |
|      456      ||      734     ||     potato   ||     0.1        ||        5.0     |
|      456      ||      423     ||     potato   ||     0.1        ||       -0.2     |
|      Total    ||      NULL    ||       NULL   ||     0.2        ||        5.0     |
|      ...      ||      ...     ||     ...      ||     ...        ||       ...      |

Как я могу это сделать? Мне нужно, чтобы это было добавлено к тому же фрейму данных для простоты, поэтому я думаю, что мне также придется привести первый столбец от int к str или сбросить «Total» до str_col3?

Спасибо!

1 Ответ

2 голосов
/ 08 октября 2019

Используйте пользовательскую функцию в GroupBy.apply для добавления новых строк, для значений фильтра выше 0 используется DataFrame.clip для замены более низких значений, таких как 0 на 0, создайте индекс по умолчанию и замените значения затуманивания на DataFrame.fillna на dict:

#if necessary sorting by first column
df = df.sort_values('int_col_1')


def f(x):
    x.loc[-1] = x[['float_col4','float_col5']].clip(lower=0).sum()
    #you can pass also mask function
    #x.loc[-1] = x[['float_col4','float_col5']].mask(lambda x: x < 0, 0).sum()
    return x

df = df.groupby('int_col_1').apply(f).reset_index(drop=True).fillna({'int_col_1':'Total'})
print (df)
  int_col_1  int_col2 str_col3  float_col4  float_col5
0       123     456.0   potato         0.1        -0.2
1     Total       NaN      NaN         0.1         0.0
2       456     456.0   potato         0.1         5.0
3       456     456.0   potato         0.1        -0.2
4     Total       NaN      NaN         0.2         5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...