ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第一次工作关键代码总结

2021-10-29 11:59:17  阅读:134  来源: 互联网

标签:总结 DF 代码 excel cell 关键 序号 data row


批量读取文件夹下xlsx的数据

提前设置好filelocation(存放要读取文件的文件夹),读取到的文件数据保存在all_data里,打印文件夹下xlsx文件总数,显示读取的文件数。

import glob
import pandas as pd
#读取文件的地址
filelocation=filelocation
# filelocation="/Users/quhongchao/Desktop/未命名文件夹 2/"  
#当前文件夹下搜索的文件名后缀  
fileform="xlsx"  
#首先查找默认文件夹下有多少文档需要整合  
filearray=[]  
for filename in glob.glob(filelocation+"*."+fileform):  
    filearray.append(filename)  
#以上是从pythonscripts文件夹下读取所有excel表格,并将所有的名字存储到列表filearray
print("在默认文件夹下有%d个文档"%len(filearray)) 
ge=len(filearray)  
matrix = [None]*ge  
#定义空的DataFrame,接收数据
all_data = pd.DataFrame()
#读取数据
for i in range(ge):
    print(i)
    l_data = pd.read_excel(filearray[i])
    all_data = all_data.append(l_data)

去掉列表中部分数值前面的特殊字符

all_data['商户姓名']=all_data['商户姓名'].apply(lambda x:x.replace('\n', '').replace('\r', ''))

时间的显示方式

data['交易时间'] = pd.to_datetime(
    data.交易时间, 
    format='%Y/%m/%d')

做汇总,t1 是第一次交易的时间,t2为最后一笔交易的时间。

money=data.groupby('ming')['交易金额'].sum()
t1=data.groupby('ming')['交易时间'].min()
t2=data.groupby('ming')['交易时间'].max()
h3=data.groupby('ming')['sn编码']
aaaa=[]
for i in h3:
    a1=i[1].tolist()
    b=a1[0]
    c=str(b)
    aaaa.append(c)

df={'名字':money.index,'sn编码':aaaa,"第一笔交易的时间":t1,"最后一笔交易的时间":t2,"累计刷卡金额":money}
DF=pd.DataFrame(df)

# t3=t2-t1
DF['活跃天数']=t2-t1
DF['活跃月数']=round(DF['活跃天数']/pd.Timedelta(days=30),1)
DF['平均月刷卡金额']=round(DF['累计刷卡金额']/DF['活跃月数'],1)
# DF['沉默天数']=pd.datetime.now()-DF['最后一笔交易的时间']
# DF['沉默天数']=pd.to_datetime("2021-9-1")-DF['最后一笔交易的时间']
DF['沉默天数']=pd.to_datetime(suanchentime)-DF['最后一笔交易的时间']
#组合列还原原始信息
DF['商户姓名']=DF['名字'].map(lambda x:x.split("&")[0])
DF['合伙人姓名']=DF['名字'].map(lambda x:x.split("&")[1])
DF['商户编号']=DF['名字'].map(lambda x:x.split("&")[2])
DF['合伙人编号']=DF['名字'].map(lambda x:x.split("&")[3])

#按照某列条件对另一列赋值
DF.loc[DF['活跃月数']<1,['平均月刷卡金额']] = 0
DF.loc[DF['活跃月数']<1,['备注']] = "——"

M=DF[DF["沉默天数"]>pd.Timedelta(days=60)]
H=DF[DF["沉默天数"]<pd.Timedelta(days=60)]

按照客户总数降序排列

CCC=CC.sort_values(by= ['客户总数'],ascending=False)

对合伙人、商户按照对应关系做年、月交易额汇总

qe1=pd.pivot_table(data,index=['合伙人姓名和编号','商户姓名和编号',
data.交易时间.map(lambda x:x.year),
data.交易时间.map(lambda x:x.month)],
values='交易金额',aggfunc=np.sum)

将数据存入Excel


with pd.ExcelWriter(savepath+name+'team.xlsx') as writer:
    str1 = ['活跃','沉默',"客户沉默率","月交易金额汇总"]
    HH.to_excel(writer, sheet_name= str1[0],index=False)
    MM.to_excel(writer, sheet_name= str1[1],index=False)
    CCC.to_excel(writer, sheet_name= str1[2],index=False)
#     qe1.to_excel(writer, sheet_name= str1[3])
writer.save()
writer.close()

将数据按照固定格式存储到Excel 中

导入需要的库

from openpyxl import load_workbook
from openpyxl.utils import get_column_letter 
from openpyxl.styles import Font,Border,Side,PatternFill,Alignment
from openpyxl.styles import numbers
import datetime

读取excel文件

wb = load_workbook(savepath)#使用openpyxl读取xlsx文件,创建workbook
ws = wb.active

原本时间为“2020/12/28 14:27:51”形式,只显示年月日,
金额保留一位小数且以万为单位,
月数那一列在原本数字的后面加“个月‘两个字,
天数那一列保留整数加‘天’字

#定位表单
ws1 = wb["活跃"]

#改时间  改百分数显示
rownum1=str(ws1.max_row)
print(rownum1)
for i in range(1,int(rownum1)+1):
    ws1.cell(row=i, column=7).number_format ='yyyy-mm-dd'

for i in range(1,int(rownum3)+1):
    ws3.cell(row=i, column=7).number_format ='0%'
    
    
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=9).number_format ="0!.0,万" 
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=11).number_format ='General,个月'
for i in range(1,int(rownum2)+1):
    ws1.cell(row=i, column=12).number_format ='0!天'


for i in range(1,int(rownum2)+1):
    ws2.cell(row=i, column=6).number_format ='@'

设置行高列宽

# 设置行高列宽
ws1.row_dimensions[1].height=55

for i in range(2,int(rownum1)+1):
    ws1.row_dimensions[i].height=36
        
ws1.column_dimensions['A'].width=7

加边框线

# 边框线
border_set = Border(left=Side(border_style='thin', color='000000'),
                    right=Side(border_style='thin', color='000000'),
                    top=Side(border_style='thin', color='000000'),
                    bottom=Side(border_style='thin', color='000000'))

# 给ws2第一列数据加边框
col = ws2['A']
for cell in col:
    cell.border = border_set

for row in ws1['A2:H'+str(int(rownum1)+1)]:
    for cell in row:
        cell.alignment = Alignment(horizontal='center',vertical='center',wrap_text=True)

for row in ws4["A1:F"+rownum4]:
    for cell in row:
        cell.border = border_set

设置字体

font1 = Font(u'宋体',size = 12,bold=True,italic=False,strike=False,color='000000')#12B
font2 = Font(u'宋体',size = 14,bold=True,italic=False,strike=False,color="ff0000")# 14 红 B


#改字体格式 表头居中 ws3处理完
ws1['A1'].font = font1

for i in range(2,int(rownum1)+1):
    ws1.cell(row=i, column=1).font = font1

设置水平居中,垂直居中,自动换行

# 水平居中,垂直居中,自动换行
ws1['A1'].alignment = Alignment(horizontal='center',vertical='center',wrap_text=True)

合并单元格

ws3.merge_cells('A1:G1')

架构

数据预处理

for i in name:
    data[i].fillna('WWWWWWW',inplace=True)

生成tag形式的套着字典的列表,dengji,tuijian,hehuoren都是列表

tag = [{'id': 1,  'code': '1000', 'parentCode': 'null'},
       {'id': 2, 'code': '1010', 'parentCode': '1000'},
       {'id': 3, 'code': '1011', 'parentCode': '1000'},
       {'id': 4,  'code': '1111', 'parentCode': '1011'},
       {'id': 5,  'code': '1112', 'parentCode': '1011'},
       {'id': 6,  'code': '2000', 'parentCode': 'null'},
       {'id': 7,  'code': '2010', 'parentCode': '2000'},
       {'id': 8, 'code': '2111', 'parentCode': '2010'}]
zong=[]
for i in range(len(dengji)):
    dict1={'dengji':dengji[i],'tuijian':tuijian[i],'hehuoren':hehuoren[i]}
    zong.append(dict1)

以tag形式的数据为基础
生成层级结构的json树

def one(tag):
    pl =[]
    for i in tag:
        if i['tuijian'] == '喔**部&C004':
            i['children'] = two(tag,i)
            pl.append(i)
    return pl
#     print(pl)
def two(tag,parent):
    cl=[]
    for i in tag :
        m={}
        if i['tuijian'] == parent['hehuoren']:
            cl.append(i)
            i['children'] = two(tag,i)
    return cl
one(zong)

json 数据的保存与打开

#cunchu 
import json 
#baocun为要存储的数据
with open ("baocun.json",'w')as file_obj:
    json.dump(baocun,file_obj)
    
 #dakai 
 with open('')as file_obj:
     name=json.load(file_obj)
 print(name)

Excel 字母到序号的转化,列数和序号数的变化

from openpyxl.utils import get_column_letter, column_index_from_string
 
def to_excel序号_字母(数字):
    if isinstance(数字,str): return 数字
    return get_column_letter(数字)
def to_excel序号_数字(字母):
    if isinstance(字母, int): return 字母
    return column_index_from_string(字母)
 
def get_excel序号_列表(开头序号_字母或数字__包括开头,结尾序号_字母或数字__包括结尾,生成字母列表=True):
    开头序号 = to_excel序号_数字(开头序号_字母或数字__包括开头)
    结尾序号 = to_excel序号_数字(结尾序号_字母或数字__包括结尾)
    返回列表 = []
    for i in range(开头序号,结尾序号+1):
        返回列表.append(i)
    if 生成字母列表:
        返回列表 = stream(返回列表).map(lambda i: to_excel序号_字母(i)).collect()
    return 返回列表

设置列宽

for i in range(84):
    a=to_excel序号_字母(i+1)
    ws.column_dimensions[a].width=33

合并单元格

#合并第a列相同的信息,a为列号
def hebing(a):
        # 需要处理的文件
#     file = r'86ji.xlsx'
#     wb = load_workbook(file)
#     # 数据存放的工作表'Sheet1'
#     ws = wb['Sheet1']

    # 获取第一列数据
    type_list = []
    i = 2
    while True:
        r = ws.cell(i, a).value
        if r:
            type_list.append(r)
        else:
            break
        i += 1
#     print(type_list)
    # 判断合并单元格的始末位置
    start = 0
    end = 0
    flag = type_list[0]
#     print(flag)
    for i in range(len(type_list)):
        if type_list[i] != flag:
            flag = type_list[i]
            end = i - 1
            if end >= start:
                ws.merge_cells(to_excel序号_字母(a) + str(start + 2) + ":" +to_excel序号_字母(a)+ str(end + 2))
                start = end + 1
        if i == len(type_list) - 1:
            end = i
            ws.merge_cells(to_excel序号_字母(a) + str(start + 2) + ":"+to_excel序号_字母(a) + str(end + 2))

  
for i in range(83):
    print(i)
    hebing(i+1)

生成映射字典,将某些值替换

hehuoren3=D.合伙人编号姓名手机号.tolist()
hehuoren1=D.合伙人姓名.tolist()
dictmap=dict(zip(hehuoren3,hehuoren1))
a=f1.applymap(lambda s: dictmap.get(s) if s in dictmap else s)
D['bianma']=D['推荐'].map(lambda x:x.split("&")[-1])

字典的键值反转


#键值反转

reverse_dict1 = dict([(value,key) for (key,value) in dict1.item()])

将一列的值按照对应关系转换

D['bianma'] = D['bianma'].map(temp)

列换名字

D.rename(columns={'bianma':'tuijian'})

标签:总结,DF,代码,excel,cell,关键,序号,data,row
来源: https://blog.csdn.net/weixin_49050875/article/details/120429856

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有