Суммируйте столбцы итеративно в зависимости от условия - PullRequest
0 голосов
/ 05 июля 2018

С учетом фрейма данных:

import pandas as pd

df = pd.DataFrame({'A': [None, 1, 1, 2, 1, None, 2],
                   'B': [1, None, None, 1, 5, None, 3],
                   'C': [2, 4, 1, None, 5, None, 2],
                   'D': [3, None, 1, None, 5, None, 1],
                   'E': [None, 1, None, None, None, None, 7]})

    A   B   C   D   E
0   NaN 1.0 2.0 3.0 NaN
1   1.0 NaN 4.0 NaN 1.0
2   1.0 NaN 1.0 1.0 NaN
3   2.0 1.0 NaN NaN NaN
4   1.0 5.0 5.0 5.0 NaN
5   NaN NaN NaN NaN NaN
6   2.0 3.0 2.0 1.0 7.0

Я хочу суммировать столбцы один за другим, основываясь только на непустых строках каждого последовательного столбца. Это можно сделать так:

ls = []
names = []
for column in df.columns:
    names += [column]
    ls += [df.loc[df[column] > 0, :].sum()]

pd.concat(ls, keys=names, axis = 1)

Какие результаты:

     A    B    C    D    E
A   7.0  5.0  5.0  4.0  3.0
B   9.0  10.0 9.0  9.0  3.0
C   12.0 9.0  14.0 10.0 6.0
D   7.0  9.0  10.0 10.0 1.0
E   8.0  7.0  8.0  7.0  8.0

Однако я уверен, что есть лучший способ сделать это. Есть предложения?

1 Ответ

0 голосов
/ 06 июля 2018

Замените NaN на 0, транспонируйте df и умножьте матрицу на матрицу "маски", равную 1, где df не равно нулю:

mask = df.notnull().astype(int)
df.fillna(0).T.dot(mask)
      A     B     C     D    E
A   7.0   5.0   5.0   4.0  3.0
B   9.0  10.0   9.0   9.0  3.0
C  12.0   9.0  14.0  10.0  6.0
D   7.0   9.0  10.0  10.0  1.0
E   8.0   7.0   8.0   7.0  8.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...