pandas 分组统计 列联表pd.crosstab()

pandas分组的统计方式

 

index 减肥方式 血压含量
0 药物
1 饮食
2 锻炼 正常
3 抽脂
4 药物
5 抽脂
...    
498 药物
499 饮食

我们需要统计多个字段的次数:

如下表数据:

减肥方式

\血压含量

药物 饮食 锻炼 抽脂 总和
50 38 38 30 156
正常 46 40 40 45 171
37 44 37 55 173
总和 133 122 115 130 500

通常多个组的统计可以采用DataFrame.groupby(by=['减肥方式','血压含量'])['减肥方式'].count().reset_index(name='次数')

                                                                              pandas 分组统计 列联表pd.crosstab()_第1张图片

这里我们能看到我们采用分组统计之后,能详细看到表格的统计,但是却不利于开发的统计

附下,采用分组统计的方式

def list_set(list_1):
    list_2 = list(set(list_1))
    list_2.sort(key=list_1.index)
    return list_2

def func(df,df_title_X,df_title_Y):
  
    df_data = df.groupby(by=[df_title_X,df_title_Y])[df_title_X].count().reset_index(name='次数')

    data_dict = {}
    for i in df_data[df_data.columns[0]]:
        data_dict[i] = {}
        for a in df_data[df_data.columns[1]]:
            data_dict[i][a] = {}
    for i in range(df_data.shape[0]):
        data_dict[df_data[df_data.columns[0]].loc[i]][df_data[df_data.columns[1]].loc[i]] = df_data[df_data.columns[2]].loc[i]

    l = [list(i.values()) for i in data_dict.values()]

    return pd.DataFrame(np.array(l).T,columns=list_set(df_data[df_title_X].to_list()),
                      index=list_set(df_data[df_title_X].to_list()))


print(func(df,'减肥方式','血压含量'))

                                          结果如下:

                                                              pandas 分组统计 列联表pd.crosstab()_第2张图片

在查阅pandas的官方文档之后,我们了解到了这种叫做列联表,pandas.crosstab()的函数

import pandas as pd
pd.crosstab()

 

print(pd.crosstab(df['血压含量'],df['减肥方式'],margins=True,margins_name='总和'))
print(pd.crosstab(df['血压含量'],df['减肥方式'],margins=True,margins_name='总和').to_dict())

                                              pandas 分组统计 列联表pd.crosstab()_第3张图片pandas 分组统计 列联表pd.crosstab()_第4张图片

pandas 分组统计 列联表pd.crosstab()_第5张图片                                          pandas 分组统计 列联表pd.crosstab()_第6张图片

后续还有透视表pandas.pivot_table(),就自行查看pandas的官方文档。

你可能感兴趣的:(pandas,python,机器学习,数据分析)