第一次写博客,不足之处很多,希望大家多多包含~
问题引入:
对如下所示的表格进行可视化时,需要提前对数据的形式进行预处理,以下为原数据形式:
显然这种形式不太行,因为笔者想把这些"用来表示时间的列名"单独设置为时间维度,从而在可视化BI软件可以方便的使用筛选等时间序列特有的功能。因此,在导入之前就要先把这种二维表格的数据进行降维,通过类别内的笛卡尔积,降维成一条条记录式的普通一维表。
最后解决的思路:
先进行一个简单的填充:(对于各个空格,引用前一行的数据进行填充)
data = data.fillna(method='pad',axis=0)
效果如下:
然后利用stack函数进行聚合:
data_temp = data.copy()
data_temp = data_temp.set_index(["指标","商品"]).stack()
data_temp = data_temp.reset_index()
data_temp.columns = ["指标",'商品','时间','销售件数']
data_temp
可以看到,指标按照类别都做了笛卡尔积,并且变成一条条记录的样式。
问题得以解决!
补充:stack()函数的作用是“堆叠”,可以将表格的横向列旋转到行,在二级指标的存在下,需要提前指定set_index后的列表,然后再进行stack(),否则会出现很多大类的笛卡尔积nan值,而不是各个有效的小分类内的笛卡尔积了。
# 附录:一个提取各级目录的代码块:
first_list = list(set(data["指标"]))
index_list = [[] for i in range(len(first_list))] # 创建一个列数等于first_list的空数组
for i in range(len(first_list)):
temp_table = data[data["指标"] == first_list[i]]
temp_list = list(set(temp_table["商品"]))
index_list[i].append(first_list[i])
index_list[i].append(temp_list) # index_list存放着所有的分类,其中index_list[i][0]都是一级分类:“指标”的名字, 这个序列后面的元素则是index_list[i][0]这一大分类下的二级分类:“商品”print(index_list)
第一次写博客,作为CSDN多年的使用者,从CSDN上的许多大佬帖子上学到了很多,于是想把自己生活中遇到的点滴小问题和大家分享,真心希望可以对大家有所帮助!