利用pandas建一张列自适应的表

场景是统计总公司分子公司下的收入情况,表格如下
公司名称支付宝微信银联其他备注
小明有限公司100300砸锅卖铁
小强有限公司020010换不锈钢盆

只做一个导出功能,我修改记录表中数据对原有值无影响,所有我只在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_NUMINCOME_NAME
010支付宝
130银联

 

需要进行一步操作将INCOME_NAME的值变为列名,进行两步操作

首先进行转置

read_data = read_data.T
read_data = read_data.reset_index(drop=True)

具体数据格式如下:

01
01030
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)

得到我们想要的数据格式

支付宝微信
01030

我们还有一个存放公司信息的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)

最终数据格式如下 

公司名称支付宝微信备注
小明有限公司1030砸锅卖铁

存在多条这样的数据将其放一个列表,利用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简直太强了,作为理论物理系的学生,当初为啥不好好学啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值