Pandas实战小技巧,很多列的Explode多行!

共 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带副业全套餐有优惠!!!



浏览 72
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报