具有独立索引的动态数据透视表

时间:2020-07-20 15:45:03

标签: python pandas

我有一个包含基本社交变量和许多其他协变量的数据框。对于sociodem变量,我想创建一个数据透视表,以便两列由Test Result聚合。我想要一些按计数分类的变量和按中位数分类的变量。例如,我想捕获WBC的中位数,但我想用Race来计数。

我不确定如何构造我的数据透视表或groupby表,因为我知道该列需要为Test Result,索引需要为其他协变量,但是我不能将多个索引作为不同的变量。 / p>

Example Dataframe
ID    Race    WBC_Count  Cough  (0/1)  Test Result....
1     black     23.6       0                Positive 
2     white     13.5       1                Negative
3     hispanic  20.3       0                Positive

               Positive Negative 
Black             23        54
White             23        56
Asian             34        18
...
WBC(median)      13.5       10.9
Cough(count)     23          13

1 个答案:

答案 0 :(得分:1)

  • 在所需的列上使用pandas.DataFrame.groupby
  • pandas.DataFrame.agg与不同的功能一起用于不同的列
  • 我知道该列需要是“测试结果”,而索引需要是其他协变量,但是我不能将多个索引作为不同的变量。
  • 问题中提供的示例数据不易复制,因此已为该答案提供了可复制的数据集。
import pandas as pd
import numpy as np
import random

# sample data
np.random.seed(365)
random.seed(365)
data = {'a': [np.random.randint(10) for _ in range(25)],
        'groups': [random.choice(['1-5', '6-25', '26-100', '100-500', '500-1000', '>1000']) for _ in range(25)],
        'treatment': [random.choice(['Yes', 'No']) for _ in range(25)],
        'date': pd.bdate_range(datetime.today(), freq='d', periods=25).tolist()}
df = pd.DataFrame(data)

# display(df.head())
 a  groups treatment       date
 2   >1000       Yes 2020-07-20
 4  26-100       Yes 2020-07-21
 1   >1000       Yes 2020-07-22
 5    6-25        No 2020-07-23
 2  26-100       Yes 2020-07-24

# groupby and aggregate different features of different columns
df.groupby(['groups', 'treatment']).agg({'a': 'mean', 'groups': 'count'}).reset_index(level='treatment')

         treatment         a  groups
groups                              
1-5             No  5.000000       3
1-5            Yes  7.000000       1
100-500         No  5.500000       2
100-500        Yes  3.000000       2
26-100          No  9.000000       1
26-100         Yes  2.666667       3
500-1000        No  2.666667       3
500-1000       Yes  7.500000       2
6-25            No  5.500000       2
6-25           Yes  5.333333       3
>1000          Yes  2.000000       3