Pandas实战小技巧,很多列的Explode多行!
蚂蚁学Python
共 2548字,需浏览 6分钟
·
2022-07-27 22:58
今天在蚂蚁老师的交流学习群中看到有一个同学问的一个关于excel自动化处理的问题,最近刚学完蚂蚁老师的Python实现Excel办公自动化系列课程,正好牛刀小试一下。
需求
有一个表格需要转置成另外一个形式的表,如图:
其实可以理解批量对多个产品进行分类汇总
思路
1、按产品拆成多个DataFrame
2、批量合并多个DataFrame
3、按订单号分组,数量排序
4、写到excel中
难点是如何按产品拆成多个DataFrame,我的思路是这样的,使用pandas读取文件,'订单号'作为索引列,获取到DataFrame的字段信息,这些字段涵盖了每个产品的信息,然写个方法将一个列表按指定数目分成多个列表的,每一个小列表就是每个产品的字段信息,那么就可以活获取到对应的数据了。解决了这个问题剩余的就比较简单了。就是合并数据,处理数据,写excel。
代码实现
# -- coding: utf-8 --
# @Time : 2022/7/27 21:54
# @Author : 小牛刀
# @File : 批量对多个产品进行分类汇总.py
# @Software: PyCharm
import pandas as pd
import xlwings as xw
# app = xw.App(visible=False, add_book=False)
# wb = app.books.open('df.xlsx')
# sheet = wb.sheets[0]
# df = sheet.range('A1').options(pd.DataFrame, expand='table').value
# columns_list = list(df.columns)
df = pd.read_excel('df.xlsx',index_col='订单号')
columns_list = list(df.columns)
print(columns_list)
#
# 把一个列表按指定数目分成多个列表的
def list_of_groups(init_list, children_list_len):
list_of_groups = zip(*(iter(init_list),) * children_list_len)
end_list = [list(i) for i in list_of_groups]
count = len(init_list) % children_list_len
end_list.append(init_list[-count:]) if count != 0 else end_list
return end_list
# 将产品分割成指定字段
columns_list = list_of_groups(columns_list, 5)
df_list = []
for col in columns_list:
df1 = df[col]
# 将字段替换为指定字段
df1.columns = ['产品', '名称', '重量', '数量', '备注']
# print(df1)
df_list.append(df1)
df_all = pd.concat(df_list)
# 删除空行
df_all.dropna(inplace=True)
# 重置索引
df_all.reset_index(inplace=True)
# 按订单号分组,数量排序
new_df = df_all.groupby('订单号').apply(lambda x: x.sort_values(by='数量', ascending=False))
print(new_df)
new_df.to_excel('result.xlsx', index=False)
# wb.save()
# wb.close()
# app.quit()
总结
这个案例用到的数据技术主要是pandas处理excel,就是蚂蚁老师在课程里讲过的知识。通过这个案例发现老师的课程真的太实用了,并且温故了知识又解决了同学的问题。
写在最后
这里强烈推荐一下蚂蚁的python课程,全都面向实战,不注水,全干货。就这案例目而言,pandas,课程里都有讲过的,学完做像这样的案例就很easy。
今晚来蚂蚁老师抖音直播间,Python带副业全套餐有优惠!!!
评论