当前位置: 首页 > 科技观察

一行代码做数据分析交叉表,原来这么方便_0

时间:2023-03-12 02:02:03 科技观察

在上一篇文章中,我们了解到可以使用Pandas模块中的pivot_table()函数来做数据透视表。模块导入和数据读取。按照惯例,我们先导入模块,读取要使用的数据集。引用仍然是用于制作数据透视表的数据集。importpandasaspddefload_data():returnpd.read_csv('coffee_sales.csv',parse_dates=['order_date'])这里小编通过自定义一个函数来读取数据,然后调用该函数。在实际工作中,大家可以根据自己的喜好进行操作:df=load_data()df.head()outputcrosstab是一种特殊的数据透视表,用来统计组的频率。简单来说,就是用两列或多列的唯一元素组成一个新的DataFrame。新数据的行列交集的值就是它在原数据中的组合个数。我们先看一个简单的例子,代码如下:pd.crosstab(index=df['region'],columns=df['product_category'])输出表示行方向不同区域,列方向不同咖啡种类,结果显示不同地区不同咖啡种类的汇总数据,df[(df["region"]=="Central")&(df["product_category"]=="Tea")].shape[0]output336例如,我们筛选出地域为中部地区,品种为茶叶的数据,结果一共336条数据,与交叉表中的结果一致。我们可以通过调用rownames参数和colnames参数来改变列名和行索引的名称,代码如下:pd.crosstab(index=df['region'],columns=df['product_category'],rownames=['USRegion'],colnames=['ProductCategory'])输出除了咖啡的品类,我们还想知道不同品种的咖啡在批发和零售之间的销售数据,所以可以这样做:pd.crosstab(index=df['region'],columns=[df['product_category'],df['market']])输出或pd.crosstab(index=df['region'],columns=[df['product_category'],df['market']],rownames=['USRegion'],colnames=['ProductCategory','Market'])输出的DataFrame数据集中有两列,最上面的是咖啡的种类,然后第二层是不同的市场。当然我们也可以在行方向添加多级索引。代码如下:pd.crosstab(index=[df['region'],df['market']],columns=df['product_category'])输出的高级操作同pd.pivot_table()函数,我们也可以通过调用margin参数将综合数据累加起来,代码如下:pd.crosstab(index=df['region'],columns=df['product_category'],margins=True)output我们还可以指定列的列名。pd.crosstab(index=df['region'],columns=df['product_category'],margins=True,margins_name='Subtotals')output还有一个参数normalize,将所有值除以和归一化的值。pd.crosstab(index=df['region'],columns=df['product_category'],normalize=True)output我们从美观的角度想保留两位小数,代码如下:pd.crosstab(index=Ifdf['region'],columns=df['product_category'],normalize=True).style.format('{:.2%}')输出与margin参数之间结合使用,所有结果相加等于100%。代码如下:pd.crosstab(index=df['region'],columns=df['product_category'],margins=True,normalize=True).style.format('{:.2%}')进一步导出输出。最后还有两个参数,values和aggfunc。aggfunc参数具体是指指定的聚合函数,比如average、sum、median等统计方法,以及value参数指定的连续性。要计算的变量列。df.info()outputRangeIndex:4248entries,0to4247Datacolumns(total9columns):#ColumnNon-NullCountDtype-----------------------------0order_date4248非空datetime64[ns]1市场4248非空对象2区域4248非空对象3产品类别4248非空对象4product4248non-nullobject5cost4248non-nullint646inventory4248non-nullint647net_profit4248non-nullint648sales4248non-nullint64dtypes:datetime64[ns](1),int64(4),object(4)memoryusage:298.8+KB当前数据集中“market”、“region”、“product_category”、“product”四列是离散变量,而“cost”、“inventory”、“net_profit”、“sales”四列是连续变量,分别代表成本、存货、净利润和销量。其中,我们要对不同地区不同咖啡种类的成本做一个平均值,那么代码如下:pd.crosstab(iindex=df['region'],columns=df['product_category'],values=df['cost'],aggfunc='mean')output如果我们希望计算结果保留两位小数,则代码如下:pd.crosstab(index=df['region'],columns=df['product_category'],values=df['cost'],aggfunc='mean').round(2)输出当然是如果有缺失值的情况,我们也可以用其他值替换,代码如下:pd.crosstab(index=df['region'],columns=df['product_category'],values=df['cost'],aggfunc='mean',)。fillna(0)输出