Выполните функцию подсчета для столбцов и добавьте строковый результат в столбцы. - PullRequest
0 голосов
/ 11 марта 2020

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

import pandas as pd
df = pd.DataFrame([('Jorh Hospital','2017-03-15', 389.0,34, 32, 34),
                   ('Jorh Hospital','2018-04-20', np.nan,22, 5, 43),
                   ('Jorh Hospital','2018-05-20', np.nan,22, 5, 43),
                   ('Bugh Hospital','2019-02-16', 80.5,np.nan, 56, np.nan),
                   ('Bugh Hospital','2019-03-23', np.nan,89, 67, np.nan),
                  ('Bugh Hospital','2019-04-23', np.nan,89, 67, np.nan)],
                  columns=('Hosp_name','date', 'max_rec', 'reg_pp', 'disch_no', 'temp_rec'))
df

То, что я пробовал, это то, что я могу сделать только для каждого столбца. Как я могу сделать все столбцы в одном

df['max_rec'].count()
df['reg_pp'].count()

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

import pandas as pd
dff = pd.DataFrame([('Jorh Hospital','2017-03-15', 389.0,34, 32, 34),
                   ('orh Hospital','2018-04-20', np.nan,22, 5, 43),
                   ('Jorh Hospital','2018-05-20', np.nan,22, 5, 43),
                   ('Bugh Hospital','2019-02-16', 80.5,np.nan, 56, np.nan),
                   ('Bugeh Hospital','2019-03-23', np.nan,89, 67, np.nan),
                  ('ugh Hospital','2019-04-23', np.nan,89, 67, np.nan)],
                  columns=('Hosp_name','date', 'max_rec N=2', 'reg_pp N=5', 'disch_no N=6', 'temp_rec N=3'))
dff

Ожидается

dff = pd.DataFrame([('max_rec','50% (1)', '50%(1)'),
                   ('reg_pp','100%(0)', '50%(1)'),
                   ('disch_no','100%(0)', '100%(0)'),
                   ('temp_rec','100%(0)', '0')],
                  columns=('variables','Jorh Hospital (N=2)', 'Bugh Hospital (N=2)'))
dff

1 Ответ

1 голос
/ 11 марта 2020

Выберите все столбцы без первых 2 с помощью DataFrame.iloc и DataFrame.count, затем создайте словарь с объединенными значениями и передайте rename:

s = df.iloc[:, 2:].count()
d = dict(zip(s.index, s.index + ' N=' + s.astype(str)))
df = df.rename(columns=d)
print (df)
        Hosp_name        date  max_rec N=2  reg_pp N=5  disch_no N=6  \
0   Jorh Hospital  2017-03-15        389.0        34.0            32   
1    orh Hospital  2018-04-20          NaN        22.0             5   
2   Jorh Hospital  2018-05-20          NaN        22.0             5   
3   Bugh Hospital  2019-02-16         80.5         NaN            56   
4  Bugeh Hospital  2019-03-23          NaN        89.0            67   
5    ugh Hospital  2019-04-23          NaN        89.0            67   

   temp_rec N=3  
0          34.0  
1          43.0  
2          43.0  
3           NaN  
4           NaN  
5           NaN  

РЕДАКТИРОВАТЬ:

s = df.iloc[:, 2:].count()
d = dict(zip(s.index, s.index + ' N=' + s.astype(str)))
df = df.iloc[:,2:].notna().groupby(df['Hosp_name']).mean().T.rename(d)
print (df)
Hosp_name     Bugeh Hospital  Bugh Hospital  Jorh Hospital  orh Hospital  \
max_rec N=2              0.0            1.0            0.5           0.0   
reg_pp N=5               1.0            0.0            1.0           1.0   
disch_no N=6             1.0            1.0            1.0           1.0   
temp_rec N=3             0.0            0.0            1.0           1.0   

Hosp_name     ugh Hospital  
max_rec N=2            0.0  
reg_pp N=5             1.0  
disch_no N=6           1.0  
temp_rec N=3           0.0  

РЕДАКТИРОВАТЬ1:

df = pd.DataFrame([('Jorh Hospital','2017-03-15', 389.0,34, 32, 34),
                   ('Jorh Hospital','2018-04-20', np.nan,22, 5, 43),
                   ('Jorh Hospital','2018-05-20', np.nan,22, 5, 43),
                   ('Bugh Hospital','2019-02-16', 80.5,np.nan, 56, np.nan),
                   ('Bugh Hospital','2019-03-23', np.nan,89, 67, np.nan),
                  ('Bugh Hospital','2019-04-23', np.nan,89, 67, np.nan)],
                  columns=('Hosp_name','date', 'max_rec', 'reg_pp', 'disch_no', 'temp_rec'))

print (df)
       Hosp_name        date  max_rec  reg_pp  disch_no  temp_rec
0  Jorh Hospital  2017-03-15    389.0    34.0        32      34.0
1  Jorh Hospital  2018-04-20      NaN    22.0         5      43.0
2  Jorh Hospital  2018-05-20      NaN    22.0         5      43.0
3  Bugh Hospital  2019-02-16     80.5     NaN        56       NaN
4  Bugh Hospital  2019-03-23      NaN    89.0        67       NaN
5  Bugh Hospital  2019-04-23      NaN    89.0        67       NaN

df = (df.iloc[:,2:]
         .notna()
         .astype(int)
         .groupby(df['Hosp_name'])
        .agg(['sum', 'mean'])
        .stack(0))
print (df)
                            mean  sum
Hosp_name                            
Bugh Hospital disch_no  1.000000    3
              max_rec   0.333333    1
              reg_pp    0.666667    2
              temp_rec  0.000000    0
Jorh Hospital disch_no  1.000000    3
              max_rec   0.333333    1
              reg_pp    1.000000    3
              temp_rec  1.000000    3

a = df['mean'].mul(100).round(0).astype(int).astype(str) + '% '
b = '(' + df['sum'].astype(str) + ')' 

s = df['sum'].sum(level=0)
d = dict(zip(s.index, s.index + ' N=' + s.astype(str)))
print (d)
{'Bugh Hospital': 'Bugh Hospital N=6', 'Jorh Hospital': 'Jorh Hospital N=10'}

df = a.add(b).unstack(0).rename(columns=d)
print (df)
Hosp_name Bugh Hospital N=6 Jorh Hospital N=10
disch_no           100% (3)           100% (3)
max_rec             33% (1)            33% (1)
reg_pp              67% (2)           100% (3)
temp_rec             0% (0)           100% (3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...