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()问题

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

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

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()问题

在查阅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()问题

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

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

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持恩蓝小号。

原创文章,作者:SLVQG,如若转载,请注明出处:http://www.wangzhanshi.com/n/6113.html

(0)
SLVQG的头像SLVQG
上一篇 2024年12月29日 12:46:13
下一篇 2024年12月29日 12:46:16

相关推荐

发表回复

登录后才能评论