场景是统计总公司分子公司下的收入情况,表格如下
公司名称 | 支付宝 | 微信 | 银联 | 其他 | 备注 |
小明有限公司 | 10 | 0 | 30 | 0 | 砸锅卖铁 |
小强有限公司 | 0 | 20 | 0 | 10 | 换不锈钢盆 |
只做一个导出功能,我修改记录表中数据对原有值无影响,所有我只在mysql数据库中建了一张record表,用来记录子公司有收入,收入类别具体值没有专门建表来存储,只能通过汇总信息得来,查询之后,对于单个公司返回的数据接口如下
min_data = [{"INCOME_NUM": 10, "INCOME_NAME": "支付宝"},{"INCOME_NUM": 30, "INCOME_NAME": "银联"}]
将其转化为dataframe格式
import pandas as pd
read_data = pd.DataFrame(min_data)
具体数据格式如下:
INCOME_NUM | INCOME_NAME | |
0 | 10 | 支付宝 |
1 | 30 | 银联 |
需要进行一步操作将INCOME_NAME的值变为列名,进行两步操作
首先进行转置
read_data = read_data.T
read_data = read_data.reset_index(drop=True)
具体数据格式如下:
0 | 1 | |
0 | 10 | 30 |
1 | 支付宝 | 微信 |
再利用numpy取出列值赋值就可以给columns即可
import numpy as np
read_data_array = np.array(read_data)
具体数据格式为
[[10 30]
['支付宝' '微信']]
进行赋值操作
read_list = read_data_array.tolist()
r_list = read_list[1]
read_data.columns = r_list
read_data.drop([1], inplace=True)
得到我们想要的数据格式
支付宝 | 微信 | |
0 | 10 | 30 |
我们还有一个存放公司信息的dataframe
company_data = pd.DataFrame([{"公司名称": "小明有限公司", "备注":"砸锅卖铁"}])
###利用创建一个merge_word的字段利用merge就可以合并为一条完整的数据
company_data['merge_word'] = 1
read_data['merge_word'] = 1
readData = pd.merge(company_data, read_data, how='left', left_on='merge_word', right_on='merge_word')
readData = readData.drop('merge_word', axis=1)
最终数据格式如下
公司名称 | 支付宝 | 微信 | 备注 |
小明有限公司 | 10 | 30 | 砸锅卖铁 |
存在多条这样的数据将其放一个列表,利用concat就可以合并
rm_data = []
rm_data.append(read_data)
writeData = pd.concat(rm_data).reset_index(drop=True)
进行如下操作就可以将公司名称列放在第一排,备注列放在最后一排
#将备注放在最后一列
comment = writeData['备注']
writeData.pop('备注')
writeData = writeData.fillna(0)
writeData.insert(writeData.shape[1], '备注', comment)
#将公司名称放在第一列
company_name = writeData['公司名称']
writeData.pop('公司名称')
writeData.insert(0, '公司名称', company_name)
下面就是写入环节,不在赘述,简单放代码
import xlwt
excelBook = xlwt.Workbook(encoding='utf-8')
excelFileName = "company_data"
excelSheetName = "2022-06"
excelSheet = excelBook.add_sheet(excelSheetName, cell_overwrite_ok=True)
row_count = writeData.shape[1]
column_count = len(writeData)
#取列名赋值给单元格
columns_name = list(writeData.columns.values)
for i in range(len(columns_name)):
excelSheet.write(0, i, columns_name[i])
#往表中写入数值
nRow = 0
for i in range(column_count):
nRow += 1
row = writeData.loc[i]
for j in range(len(row)):
excelSheet.write(nRow, j, row[j])
nginx_url = "..../" + excelFileName
excelBook.save(nginx_url.encode('utf-8'))
pandas简直太强了,作为理论物理系的学生,当初为啥不好好学啊