【Pandas必看】合并统计三列DataFrame数据关系,绘制带有Z轴分类的柱状图

合并统计三列DataFrame数据关系,绘制带有Z轴分类的柱状图

       大家好,欢迎来到我的技术博客。今天我要给大家介绍一种非常有趣的数据统计方法,我们将使用pandas库进行数据处理和分析。我们将使用到三列数据,在两列数据汇总基础上,通过第三列数据再次分类组合数据。

案例: 统计三类数据关系并绘制具有Z轴分类的柱状图:如何使用柱状图展示含油性、物性和厚度之间的关系。就需要我们统计三列数据数据,生成一个新的DataFrame,并将结果存储在一个字典中。

微信截图_20231202210944

1. 制作数据集

首先,让我们来看一下待处理的数据集。这个数据集描述了不同含油性和物性之间的厚度数据。我们要对这些数据进行sum运算,以物性为行、含油性为列进行统计。生成一个新的DataFrame。

# 导入pandas库
import pandas as pd

# 原始数据集
DIC = {
    "含油性": ["富含油", "富含油", "富含油", "饱含油", "饱含油", "饱含油", "不含油", "饱含油", "不含油"],
    "物性": ['泥岩', '细砂岩', '中砂岩', '粗砂岩', '泥岩', '细砂岩', '粗砂岩', '粗砂岩', "泥岩"],
    "厚度": [10, 11, 12, 13, 14, 15, 16, 10, 10],
}

# 将字典转换为DataFrame
df = pd.DataFrame(DIC)
print(df)

运行以上代码,我们可以看到原始的数据集如下:

   含油性   物性  厚度
0  富含油   泥岩  10
1  富含油  细砂岩  11
2  富含油  中砂岩  12
3  饱含油  粗砂岩  13
4  饱含油   泥岩  14
5  饱含油  细砂岩  15
6  不含油  粗砂岩  16
7  饱含油  粗砂岩  10
8  不含油   泥岩  10

2. 统计数据

接下来,我们使用pivot_table()函数对数据进行统计,并以物性为行、含油性为列,统计厚度的 sum 运算结果。得到新的 dataframe 数据。

# 使用pivot_table函数进行统计
new_df = df.pivot_table(index='物性', columns='含油性', values='厚度', aggfunc='sum')
new_df = new_df.fillna(0)
print(new_df)

运行以上代码,我们可以得到统计结果如下:

含油性   不含油   富含油   饱含油
物性                   
中砂岩   0.0  12.0   0.0
泥岩    10.0  10.0  14.0
粗砂岩  16.0   0.0  23.0
细砂岩   0.0  11.0  15.0

pivot_table介绍

pivot_table 函数可以根据所选择的索引列、列名和值列,对原始数据进行重塑和汇总,从而得到更方便分析的结果。它常用于数据透视与汇总,能够轻松地进行数据转换和计算。

使用 pivot_table 函数有以下主要参数:

  • data:要进行透视的 DataFrame 数据。
  • values:需要聚合的数值列。
  • index:用于分组和聚集的行列索引。
  • columns:用于生成透视表的列名。
  • aggfunc:聚合函数,用于计算重叠值的方式,默认为求平均值。

通过适当设置这些参数,可以根据需要自由控制生成透视表的形式和内容。pivot_table 函数极大地简化了数据的重塑和汇总过程,使得分析人员能够更快速地获取所需的信息。

3. 字典存储数据

接着,我们将统计结果存储在一个字典中,这样可以方便后续的数据可视化。

# 用字典存储数据
new_df_dict = {}
for col_name in new_df.columns:
    new_df_dict[col_name] = new_df[col_name].tolist()
print(new_df_dict)

运行以上代码,我们可以看到统计结果存储在字典中:

{'不含油': [0.0, 10.0, 16.0, 0.0], '富含油': [12.0, 10.0, 0.0, 11.0], '饱含油': [0.0, 14.0, 23.0, 15.0]}

以上就是完整的数据处理和统计过程。通过使用pandas库的pivot_table()函数,我们可以方便地对数据进行sum运算并统计结果。同时,将结果存储在字典中,可以方便后续的使用。

4. 绘制柱状图

现在我们已经准备好了绘制柱状图所需的数据。接下来,使用Matplotlib库来绘制数据柱状图。

	
    label_x = ['泥岩', '细砂岩', '中砂岩', '粗砂岩', '泥岩', '细砂岩', '粗砂岩', '粗砂岩', "泥岩"] # x轴内容
    colors=[]
    tick_step=1, group_gap=0.2, bar_gap=0
    # y、z轴内容
    data_dic = {'不含油': [0.0, 10.0, 16.0, 0.0], '富含油': [12.0, 10.0, 0.0, 11.0], '饱含油': [0.0, 14.0, 23.0, 15.0]}
    
    z_lables = list(data_dic.keys())
    datas = list(data_dic.values())

    fig, ax = plt.subplots() # 创建画布、画图对象

    # x为每组柱子x轴的基准位置
    x = np.arange(len(label_x)) * tick_step
    # group_num为数据的组数,即每组柱子的柱子个数
    group_num = len(datas)
    # group_width为每组柱子的总宽度,group_gap 为柱子组与组之间的间隙。
    group_width = tick_step - group_gap
    # bar_span为每组柱子之间在x轴上的距离,即柱子宽度和间隙的总和
    bar_span = group_width / group_num
    # bar_width为每个柱子的实际宽度
    bar_width = bar_span - bar_gap

    # 绘制柱子
    for index, y in enumerate(datas):
        bars = ax.bar(x + index * bar_span, y, bar_width, label=z_lables[index], color=colors[index])

    ax.set_ylabel("Y轴")
    ax.set_xlabel("X轴")
    titleText = xlabel + "-" + ylabel + "分组柱状图"
    ax.set_title(titleText)
    
    # ticks为新x轴刻度标签位置,即每组柱子x轴上的中心位置
    ticks = x + (group_width - bar_span) / 2

    ax.set_xticks(ticks)
    ax.set_xticklabels(label_x)

    legend = ax.legend()
    

       通过这个柱状图,我们可以直观地看出不同含油性和物性之间的厚度差异。每一列代表含油性,每个柱子代表一个物性,柱子的高度则表示对应的厚度。

       希望本文能够帮助您理解如何进行数据的可视化处理,并通过柱状图展现数据之间的关系。如果您对本文有任何疑问或想法,请随时在评论区留言,我将尽快回复。感谢大家的阅读!记得关注我的博客,将会有更多的有趣内容等着你!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值