实例需求:
每个货号的库位信息包含多个库位,需要把合格库位和半成品库位分离出来
解决步骤:
- 导入模块,建立sqlite连接器
# %% 提取数据 从sqlite
import pandas as pd
from sqlalchemy import create_engine
'''创建sqlite3连接'''
eg = create_engine('sqlite:///F:/XX/Database/xx2022.db') #创建数据库连接
# 读取数据库文件
q_store = """
select * from pj_store
"""
- 从sqlite提取想要的数据
cols= ['节庆','货号','库位']
df_store = pd.read_sql(q_store,eg)[cols].query('节庆=="夏季"').fillna("X") #空值用X填充,否则会出错
- 设置哪些式半成品库位
# %% 设置哪些是半成品库位
address_banA2 = ['A2-'+str(x) for x in range(16,34,1)] #半成品库位A2-16~33
address_banA8 = ['A8-'+str(x) for x in range(30,32,1)] #半成品库位A8-30~31
address_banA5 = ['A5-'+str(x) for x in range(1,15,1)] #半成品库位A5-1~15
address_banA15 = ['A15-'+str(x) for x in range(1,15,1)] #半成品库位A15-1~15
address_banA11 = ['A11-'+str(x) for x in range(1,14,1)] #半成品库位A11-1~13
address_ban = address_banA2+address_banA8+address_banA5+address_banA15+address_banA11
-
设置处理函数
- 库位分离函数,拆分单元格内库位并多行显示
def explode_table(df): df['库位'] = df['库位'].str.split(' ') # 对合格库位多行分割 df = df.explode('库位') return df
- 筛选提取半成品库位
def get_address_ban(df): return df.query('库位 in @address_ban') # @,外部变量
- 筛选提取良品库位
def get_address_good(df): return df.query('库位 not in @address_ban')
- 合并同一货号多个库位的到同一个单元格
# 合并库位到1个单元格 def join_address(df): return ' '.join(df.values)
-
筛选提取库位
#用管道pipe加载函数 df_temp = df_store.pipe(explode_table)[['货号','库位']] # 对库位进行分离 df_ban = df_temp.pipe(get_address_ban) # 提取半成品库位 df_liang = df_temp.pipe(get_address_good) # 提取良品库位
-
多个库位合并到1个单元格
df_ban =df_ban.groupby(by='货号').agg(join_address).reset_index() # 半成品库位 df_good = df_liang.groupby(by='货号').agg(join_address).reset_index() #良品库位
-
输出结果
df_good
df_ban