python-记录一些lambda使用案例

数据处理部分

def data_handle_1():
    df = pd.read_excel(os.path.join(middleware_file_path1, "家乐福未清项.xlsx"), dtype=str)
    print(df)
    # df.insert(loc=0,column="发票号码",value="")
    # 插入需求人要求列名
    df1 = pd.concat(
        [pd.DataFrame(columns=['序号', '差异类型', '是否可清账', '票据平台发票状态', '清账标识', '参考', '备注', '分配位数', '发票代码', '发票号码']), df])
    df1.fillna("", inplace=True)
    # 判断分配编号长度
    df1['分配位数'] = df1['分配编号'].str.len()
    # # 根据分配编号长度筛选后获取发票代码发票号码,需要对每次处理的做一份拷贝避免出现深浅拷贝警告
    # df2 = df1.copy()
    # df2['发票代码'].loc[df2["分配位数"] == 18] = df1['分配编号'].str[-11, -1]
    # df3 = df2.copy()
    # df3['发票号码'].loc[df2["分配位数"] == 18] = df1['分配编号'].str[0, 9]
    # print(df3)
    # enumerate 迭代出所有分配位数18的列序号
    et_index = [i for i, x in enumerate(df1['分配位数']) if df1.loc[i, '分配位数'] == 18]
    # print(et_index)
    for i in et_index:
        df1.loc[i, "发票代码"] = df1.loc[i, '分配编号'][-10:]
        df1.loc[i, "发票号码"] = df1.loc[i, '分配编号'][0:8]
    df1.to_excel(os.path.join(output, "结果文件.xlsx"), index=None)
    invoice_num = df1["发票号码"].tolist()
    return invoice_num

转化xls为xlsx

def xls2xlsx(file_path):
    if os.path.exists(file_path + "x"):
        os.remove(file_path + "x")
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    wb1 = excel.Workbooks.Open(file_path)
    wb1.SaveAs(file_path + "x", FileFormat=51)  # FileFormat = 51 is for .xlsx extension
    wb1.Close()  # FileFormat = 56 is for .xls extension
    excel.Application.Quit()
    os.remove(file_path)
    return file_path + "x"


consult()
data_handle_1()
# 根据云管家筛选发票号码导出dcm票据信息 已归档未归档都导出
invoice_num = data_handle_1()
print(invoice_num, len(invoice_num))
for i in invoice_num:
    if i != "":
        try:
            dcm(i, "true")
            dcm(i, "false")
            print(i + "导出成功")
        except:
            print(i + "无查询结果")
# 先循环更改xlsx文件
dcm_results = os.listdir(middleware_file_path2)
for i in dcm_results:
    excel_xls = os.path.join(middleware_file_path2, i)
    xls2xlsx(excel_xls)
# 合并文件
dcm_results = os.listdir(middleware_file_path2)
empty_df = pd.DataFrame()
for i in dcm_results:
    excel_xlsx = os.path.join(middleware_file_path2, i)
    df = pd.read_excel(excel_xlsx, dtype=str)
    empty_df = pd.concat([empty_df, df])
empty_df.to_excel(os.path.join(output, "556增值税发票票据.xlsx"), index=None)


empty_df = pd.read_excel(os.path.join(output, "556增值税发票票据.xlsx"), dtype=str)
# 匹配发票状态
empty_df.fillna("", inplace=True)
empty_df["分配编号"] = empty_df["发票号码"] + empty_df["发票代码"]
merge_1 = pd.DataFrame()
merge_1['分配编号'] = empty_df["分配编号"]
merge_1['发票状态'] = empty_df["发票状态"]

financial_df = pd.read_excel(os.path.join(output, "结果文件.xlsx"), dtype=str)

financial_df = pd.merge(financial_df, merge_1, how='left', on='分配编号')
financial_df['票据平台发票状态'] = financial_df["发票状态"]
financial_df = financial_df.drop('发票状态', axis=1)
financial_df.fillna("", inplace=True)
# 筛选出分配位数列除去16位和18位的部分,将备注列维护为   分配异常
financial_df["备注"] = financial_df.apply(lambda x: '分配异常' if (x["分配位数"] != "18") & (x["分配位数"] != "16") else x["备注"],
                                        axis=1)
# 筛选分配位数18位的部分的分配编号中含有 + 和 / 符号的,也维护成分配异常
financial_df["备注"] = financial_df.apply(
    lambda x: '分配异常' if (x["分配位数"] == "18") & (("+" in x["分配编号"]) | ("/" in x["分配编号"])) else x["备注"], axis=1)

# 定位凭证类型为SN的,筛选分配位数列除去16位,将备注空白的部分维护为   认证结转记账凭证
financial_df["备注"] = financial_df.apply(
    lambda x: '认证结转记账凭证' if (x["分配位数"] != "16") & (x["备注"] == "") & (x["凭证类型"] == "SN") else x["备注"], axis=1)

# 定位凭证类型为RE的,筛选分配位数列除去16位,将备注空白的部分维护为   发票记账凭证
financial_df["备注"] = financial_df.apply(
    lambda x: '发票记账凭证' if (x["分配位数"] != "16") & (x["备注"] == "") & (x["凭证类型"] == "RE") else x["备注"], axis=1)

# 筛选分配位数18位的,筛选分配位数列除去16位,将备注除分配异常 认证结转记账凭证 发票记账凭证的空白处维护   费用报销记账凭证
financial_df["备注"] = financial_df.apply(
    lambda x: '费用报销记账凭证' if ((x["分配位数"] == "18") & (x["分配位数"] != "16")) & (x["备注"] == "") & (
            (x["备注"] != '发票记账凭证') | (x["备注"] != '认证结转记账凭证') | (x["备注"] != '分配异常')) else x["备注"], axis=1)

# 筛选分配位数16位的,项目文本包含 超市事业部发票 的,将 备注 发票代码 发票号码 维护为 红票记账
financial_df["项目文本"] = financial_df["项目文本"].astype(str)
financial_df["备注"] = financial_df.apply(lambda x: '红票记账' if (x["分配位数"] == "16") & ("超市事业部发票" in x["项目文本"]) else x["备注"],
                                        axis=1)
financial_df["发票代码"] = financial_df.apply(
    lambda x: '红票记账' if (x["分配位数"] == "16") & ("超市事业部发票" in x["项目文本"]) else x["发票代码"], axis=1)
financial_df["发票号码"] = financial_df.apply(
    lambda x: '红票记账' if (x["分配位数"] == "16") & ("超市事业部发票" in x["项目文本"]) else x["发票号码"], axis=1)

# 将分配位数为16位的备注为空白的部分维护为 红通转出记账 红通 红通
financial_df["备注"] = financial_df.apply(lambda x: '红通转出记账' if (x["分配位数"] == "16") & (x["备注"] == "") else x["备注"],
                                        axis=1)
financial_df["发票代码"] = financial_df.apply(lambda x: '红通' if (x["分配位数"] == "16") & (x["备注"] == "") else x["发票代码"],
                                          axis=1)
financial_df["发票号码"] = financial_df.apply(lambda x: '红通' if (x["分配位数"] == "16") & (x["备注"] == "") else x["发票号码"],
                                          axis=1)

# 筛选票据平台发票状态为空白且备注为 发票记账凭证 或 费用报销记账凭证 的,将参考维护为 记账未认证票据平台无信息
financial_df["参考"] = financial_df.apply(
    lambda x: '记账未认证票据平台无信息' if (x["票据平台发票状态"] == "") & ((x["备注"] == "发票记账凭证") | (x["备注"] == "费用报销记账凭证")) else x["参考"],
    axis=1)

# 将票据平台发票状态为空白且备注为认证结转记账凭证的参考维护为 认证未记账票据平台无信息
financial_df["参考"] = financial_df.apply(
    lambda x: '认证未记账票据平台无信息' if (x["票据平台发票状态"] == "") & (x["备注"] == "认证结转记账凭证") else x["参考"], axis=1)

# # 显示所有列
# pd.set_option('display.max_columns', None)
# # 显示所有行
# pd.set_option('display.max_rows', None)
# # 设置value的显示长度
# pd.set_option('max_colwidth', 100)
# # 设置1000列时才换行
# pd.set_option('display.width', 1000)
# print(financial_df)
financial_df.to_excel(os.path.join(output, "结果文件.xlsx"), index=None)
posted @ 2024-05-27 21:50  AZ26  阅读(60)  评论(0)    收藏  举报