Панды: для всего набора повторяющихся записей в определенном столбце, соберите некоторую информацию - PullRequest
0 голосов
/ 02 октября 2018

У меня есть большой Dataframe, который выглядит примерно так:

     ID_Code    Status1    Status2
0      A          Done       Not
1      A          Done       Done
2      B          Not        Not
3      B          Not        Done
4      C          Not        Not
5      C          Not        Not
6      C          Done       Done

Что я хочу сделать, это рассчитать для каждого из набора дублирующих кодов идентификаторов, узнать процент не-не записейприсутствуют.(т. е. [# из Not-Not / # от общего числа записей] * 100)

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

Ответы [ 3 ]

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

IIUC с использованием crosstab

pd.crosstab(df['ID_Code'],(df['Status1'].eq('Not'))&(df['Status2'].eq('Not')),normalize ='index')
Out[713]: 
col_0       False     True 
ID_Code                    
A        1.000000  0.000000
B        0.500000  0.500000
C        0.333333  0.666667



#pd.crosstab(df['ID_Code'],(df['Status1'].eq('Not'))&(df['Status2'].eq('Not')),normalize ='index')[True]
0 голосов
/ 02 октября 2018

Возможно, я неправильно понял вопрос, но вы, похоже, имеете в виду, когда значения Status1 и Status2 равны оба Not, верно?Если это так, вы можете сделать что-то вроде:

df.groupby('ID_Code').apply(lambda x: (x[['Status1','Status2']] == 'Not').all(1).sum()/len(x)*100)

ID_Code
A     0.000000
B    50.000000
C    66.666667
dtype: float64
0 голосов
/ 02 октября 2018

Используя sum и маску boolean:

df.filter(like='Status').eq('Not').all(1).groupby(df.ID_Code).mean().mul(100)

ID_Code
A     0.000000
B    50.000000
C    66.666667
Name: flag, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...