Как посчитать ненулевые столбцы на группу? - PullRequest
0 голосов
/ 04 октября 2018

Я начал с необработанных данных, которые выглядят так:

  Case  Final    Pre    Post   
  1     A        Z      X  
        Z               V  
  2     B                  
        Y                  
  3     A        Z      Y  
        Z               U  
        W                  
  4     C        W        
        Z                  
  5     C        X      Z  
        X                  
        Z                 

, затем сделал прямую заливку:

df['Case'] = df['Case'].ffill()

примерно так:

  Case  Final    Pre    Post   
  1     A        Z      X  
  1     Z        NaN    V  
  2     B        NaN    NaN
  2     Y        NaN    NaN
  3     A        Z      Y  
  3     Z        NaN    U  
  3     W        NaN    NaN
  4     C        W      NaN
  4     Z        NaN    NaN
  5     C        X      Z  
  5     X        NaN    NaN
  5     Z        NaN    NaN

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

  Case: 5
  Final: 5
  Pre: 4
  Post: 3  

Выходные Объяснение:

1- Группировать по первому столбцуCase.

2- Даже если одно значение столбца не равно нулю (включая Case сам столбец), тогда count ++ (увеличивает ненулевое значение на 1).

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Как насчет:

grouped = df.groupby('Case', as_index=False)\
            .agg(lambda col: col.notnull().any())\
            .astype(bool)\
            .sum(axis='rows')

Мы группируем по 'Case' и выясняем, есть ли какое-либо ненулевое значение для каждого столбца.Итак,

df.groupby('Case', as_index=False)\
  .agg(lambda col: col.notnull().any())

Дает нам:

   Case  Final    Pre   Post
0   1.0   True   True   True
1   2.0   True  False  False
2   3.0   True   True   True
3   4.0   True   True  False
4   5.0   True   True   True

Использование .astype(bool) устанавливает каждое значение в столбце 'Case' равным True, поскольку они ненулевые, а затем суммируетс axis='rows' дает нам сумму каждого столбца (где True становится 1 и False 0), давая нам:

Case     5
Final    5
Pre      4
Post     3
dtype: int64
0 голосов
/ 04 октября 2018

IIUC

df.groupby(df['Case'], as_index=False).any().astype(bool).sum()

вывод

Case     5
Final    5
Pre      4
Post     3
0 голосов
/ 04 октября 2018

попробуйте это:

df.index = df.Case

df.apply(lambda x: len(x[pd.isna(x) == False].index.unique()))

Out:

Case     5
Final    5
Pre      4
Post     3
dtype: int64
0 голосов
/ 04 октября 2018

Использование:

s = df.notna().groupby(df['Case']).any().sum()
#oldier pandas versions
s = df.notnull().groupby(df['Case']).any().sum()
print (s)
Case     5
Final    5
Pre      4
Post     3
dtype: int64

Подробности :

Сначала проверьте не пропущенные значения по DataFrame.notna:

print (df.notna())
    Case  Final    Pre   Post
0   True   True   True   True
1   True   True  False   True
2   True   True  False  False
3   True   True  False  False
4   True   True   True   True
5   True   True  False   True
6   True   True  False  False
7   True   True   True  False
8   True   True  False  False
9   True   True   True   True
10  True   True  False  False
11  True   True  False  False

А затем агрегировать по столбцу Case с GroupBy.any:

print (df.notnull().groupby(df['Case']).any())
      Case  Final    Pre   Post
Case                           
1     True   True   True   True
2     True   True  False  False
3     True   True   True   True
4     True   True   True  False
5     True   True   True   True

И последними sum значениями для подсчета True s процессов, таких как 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...