合并统计三列DataFrame数据关系,绘制带有Z轴分类的柱状图
大家好,欢迎来到我的技术博客。今天我要给大家介绍一种非常有趣的数据统计方法,我们将使用pandas库进行数据处理和分析。我们将使用到三列数据,在两列数据汇总基础上,通过第三列数据再次分类组合数据。
案例: 统计三类数据关系并绘制具有Z轴分类的柱状图:如何使用柱状图展示含油性、物性和厚度之间的关系。就需要我们统计三列数据数据,生成一个新的DataFrame,并将结果存储在一个字典中。
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()
通过这个柱状图,我们可以直观地看出不同含油性和物性之间的厚度差异。每一列代表含油性,每个柱子代表一个物性,柱子的高度则表示对应的厚度。
希望本文能够帮助您理解如何进行数据的可视化处理,并通过柱状图展现数据之间的关系。如果您对本文有任何疑问或想法,请随时在评论区留言,我将尽快回复。感谢大家的阅读!记得关注我的博客,将会有更多的有趣内容等着你!