首页
关于
Search
1
git lg彩色显示日志
24 阅读
2
在 Ubuntu 22.04 LTS 中安装 Docker
19 阅读
3
CentOs/Ubuntu搭建上网x-ui
18 阅读
4
git使用多个源和多个分支
15 阅读
5
git保存账号密码
14 阅读
默认分类
网站搭建
Windows
Linux
Docker
OpenWrt
Hackintosh
Git
Python
Pandas
Web开发
JavaScript
FFmpeg
Demo
工具
刷机
油猴脚本
Excel
Chrome Extension
登录
Search
标签搜索
Pandas
读取
时区
Chrome
centos8
求和
Nginx
Typecho
404
csv
国际站
询盘导出
油猴脚本
bbr
Ubuntu
远程桌面
日志
log
数据清洗
打印机
野生程序猿
累计撰写
151
篇文章
累计收到
0
条评论
首页
栏目
默认分类
网站搭建
Windows
Linux
Docker
OpenWrt
Hackintosh
Git
Python
Pandas
Web开发
JavaScript
FFmpeg
Demo
工具
刷机
油猴脚本
Excel
Chrome Extension
页面
关于
搜索到
35
篇与
的结果
2022-05-30
Pandas的pivot_table函数(数据透视表)
pivot_table() 的特点就是默认显示指定索引列和所有数值列。索引显示的是唯一值,所以会把对应的数值处理成均值。其他str类型的列都会自动忽略。当然,使用pivot_table() 时,可以通过添加参数进行计数或求和示例中账号是int类型,如果是str类型,那么运行结果不会显示[‘账号’]这一列的内容。import numpy as np import pandas as pd df = pd.DataFrame({ '账号':[714466,714466,714466,737550,146832,218895,218895,412290,740150,141962,163416,239344,239344,307599,688981,729833,729833], '客户名称':['华山派股份有限公司','华山派股份有限公司','华山派股份有限公司','丐帮(北京) 合伙人公司','恶人谷资产管理公司','桃花岛','桃花岛','有间客栈','逍遥子影业','白驼山(上海)影视艺术有限公司','聚贤庄','全真教药业','全真教药业','天地会快递','福寿堂','快手三教育培训有限公司','快手三教育培训有限公司'], '销售':['令狐冲','令狐冲','令狐冲','令狐冲','江小鱼','江小鱼','江小鱼','段誉','段誉','欧阳克','欧阳克','欧阳克','欧阳克','韦小宝','韦小宝','韦小宝','韦小宝'], '销售总监':['岳不群','岳不群','岳不群','岳不群','岳不群','岳不群','岳不群','岳不群','岳不群','完颜洪烈','完颜洪烈','完颜洪烈','完颜洪烈','完颜洪烈','完颜洪烈','完颜洪烈','完颜洪烈'], '产品':['黑玉断续膏','葵花宝典','含笑半步癫','黑玉断续膏','黑玉断续膏','黑玉断续膏','葵花宝典','含笑半步癫','黑玉断续膏','黑玉断续膏','黑玉断续膏','含笑半步癫','葵花宝典','含笑半步癫','黑玉断续膏','黑玉断续膏','如意勾'], '数量':[1,2,1,3,1,3,1,2,4,2,2,1,3,5,2,3,1], '价格':[3000,2000,1000,3000,1000,3000,1000,2000,4000,2000,2000,1000,2000,3000,1000,4000,2000], '状态':['流程中','流程中','待审批','驳回','已完成','流程中','流程中','待审批','驳回','已完成','流程中','待审批','待审批','已完成','已完成','驳回','流程中'], })index指定单索引索引变成了[客户名称]这一列,values显示的只有数字,而且都处理成均值。比如:华山三个,数量4/3,价格6000/3,账号就不用说了,三个都一样,均值自然就是其中一个;快手两个,数量4/2,价格6000/2dd = pd.pivot_table(df,index=['客户名称'])指定多索引索引顺序能决定不同的视觉体验,虽然结果是一致的。dd = pd.pivot_table(df,index=['销售总监','销售','客户名称'])values如果不需要显示全部的数值列,可以用Values参数指定# 显然Values不能随便指定,pivot_table()只能显示数值列 print(pd.pivot_table(df, index=['销售总监','销售'], values=['状态'])) ''' Empty DataFrame Columns: [] Index: [(完颜洪烈, 欧阳克), (完颜洪烈, 韦小宝), (岳不群, 令狐冲), (岳不群, 段誉), (岳不群, 江小鱼)] '''aggfunc当我们未设置aggfunc时,它默认aggfunc='mean’计算均值。columnsfill_valuecolumns参数就是用来显示字符型数据的,和fill_value搭配使用补充:当 values,aggfunc,columns 的取值只有一个时,有无中括号效果略有不同。columns,没有的字段显示NaNfill_value,用0填充空值pd.pivot_table(df, index=['销售总监','销售'], values=['价格'],aggfunc=[np.sum],columns=['产品'])pd.pivot_table(df, index=['销售总监','销售'], values=['价格'],aggfunc=[np.sum],columns=['产品'],fill_value=0)通过添加参数,还可以显示更多信息。下面这个就花哨多了pd.pivot_table(df, index=['销售总监','销售','客户名称','产品'],values=['数量','价格'],aggfunc=[np.sum],columns=['状态'],fill_value=0,margins=True)以销售总监层面,来看销售状态(aggfunc的参数使用了字典的方式对每一列做出了不同的计算要求。也可以加多个,比如 ‘价格’:[np.mean,np.sum])pd.pivot_table(df,index=['销售总监','状态'], values=['数量','价格'], columns=['产品'],aggfunc={'数量':len,'价格':np.sum},fill_value=0,margins=True)数据透视表过滤生成数据后,你可以使用DataFrame的操作方式对其进行过滤。比如:你只想看某一位销售总监:data = pd.pivot_table(df,index=['销售总监','状态'], values=['数量','价格'], columns=['产品'],aggfunc={'数量':len,'价格':np.sum},fill_value=0) data.query("销售总监==['完颜洪烈']")查看所有待审批和驳回的交易data = pd.pivot_table(df,index=['销售总监','状态'], values=['数量','价格'], columns=['产品'],aggfunc={'数量':len,'价格':np.sum},fill_value=0) data.query("状态==['待审批','驳回']")转到Excelpd.pivot_table(df,index=['销售总监','销售','产品'], values=['数量','价格'],aggfunc=[np.sum,np.mean],fill_value=0)xs允许我向下钻取数据透视表的一个横截面。我们也可以向下钻取更多级别。取得「销售总监」为「岳不群」的数据data = pd.pivot_table(df,index=['销售总监','销售','产品'], values=['数量','价格'],aggfunc=[np.sum,np.mean],fill_value=0)xs中的level可以通过get_level_values来获得例如,我们要查看所有销售总监:查看所有销售:试着按「销售总监」进行输出:写入文件import numpy as np import pandas as pd df = pd.read_csv('F:\\Temp\\datas\\xiaoshou.csv') data = pd.pivot_table(df,index=['销售总监','销售','产品'], values=['数量','价格'],aggfunc=[np.sum,np.mean],fill_value=0) writer = pd.ExcelWriter('F:\\Temp\\datas\\output.xlsx') for name in data.index.get_level_values(0).unique(): temp_df = data.xs(name, level=0) temp_df.to_excel(excel_writer=writer, sheet_name=name) writer.save()我们得到了一个由两个sheet页的Excel文件,sheet_name分别是销售总监「完颜洪烈」和「岳不群」。
2022年05月30日
7 阅读
0 评论
0 点赞
2022-05-27
Tampermonkey阿里巴巴国际站批量导出之[产品信息]
// ==UserScript== // @name 阿里巴巴国际站批量导出产品信息 // @namespace http://tampermonkey.net/ // @version 2.1.3 // @description 导出产品ID、链接、所属赛道 // @author Mike // @icon http://is.alicdn.com/favicon.ico // @match https://hz-productposting.alibaba.com/product/* // @grant GM_addStyle // ==/UserScript== 'use strict'; var globalAllresult = []; var downloaded = false; var repeated = false; // 下面这段代码生成下载方式 (function(console){ console.save = function(data, filename){ if(!data) { console.error('Console.save: No data found!') return; } if(!filename) filename = 'console.json' if(typeof data === "object"){ data = JSON.stringify(data, undefined, 4) } var blob = new Blob([data], {type: 'text/json'}), e = document.createEvent('MouseEvents'), a = document.createElement('a') //var text = await blob.text() a.download = filename a.href = window.URL.createObjectURL(blob) a.dataset.downloadurl = ['text/json', a.download, a.href].join(':') e = new MouseEvent ("click"); //e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null) !!!deprecated!!! a.dispatchEvent(e) } })(console) // 分配记录收集方法 function collectItems(){ var productIDs = document.getElementsByClassName('product-id'); var productSubjects = document.getElementsByClassName('product-subject'); var result=[]; for (var i = 0; i < productIDs.length; i++) { console.log(productIDs[i].innerText,productSubjects[i].firstChild.href); result.push({ 'productID':productIDs[i].innerText, 'productURL':productSubjects[i].firstChild.href, 'productType':productIDs[i].parentNode.parentNode.parentNode.parentNode.childNodes[2].innerText, 'productLevel':productIDs[i].parentNode.parentNode.parentNode.parentNode.childNodes[6].innerText, }); } return result; } //与元数据块中的@grant值相对应,功能是生成一个style样式 GM_addStyle('#down_contacts_btn{color:#fb7d3c;}'); //下载按钮的html代码 var down_btn_html = '<span>'; down_btn_html += '<a href="javascript:void(0);" id="down_contacts_btn" class="S_txt2" title="一直点击,直到翻页到最后一页,自动下载,若无效请刷新重试">导出产品信息</a>'; down_btn_html += '</span>'; var inner = document.createElement('span'); inner.innerHTML = down_btn_html; //将以上拼接的html代码插入到网页标签中 var ul_tag = document.getElementsByClassName('manage-app-market-status-selector')[0].parentNode; console.log('ul_tag') console.log(ul_tag) if (ul_tag) { ul_tag.append(inner); } var btn = document.getElementById('down_contacts_btn'); btn.onclick = function(){ if (repeated) { confirm('请刷新页面后重试'); return; } if(downloaded) { repeated = true; return;//防抖,防止多次下载,刷新重启 } var nextBtns = document.getElementsByClassName('next-pagination-item'); var n = nextBtns.length-1; if (nextBtns[n].innerText != '下一页') { n = n-1; } console.log(nextBtns[n]); var nextBtn = nextBtns[n] if(!nextBtn.disabled) { console.log('next page'); let result = collectItems(); globalAllresult.push(result); nextBtn.click(); }else{ console.log('page end'); let result = collectItems(); globalAllresult.push(result); globalAllresult = [].concat(...globalAllresult); console.save(globalAllresult,"ProductsInfo.json"); downloaded = true; } // 下载数据,第一个参数是数据对象,第二个参数是要保存成文件的名字。 }
2022年05月27日
3 阅读
0 评论
0 点赞
2022-05-27
Tampermonkey阿里巴巴国际站批量导出之[询盘国家]
// ==UserScript== // @name 阿里巴巴国际站批量导出询盘国家或垃圾询盘 // @namespace http://tampermonkey.net/ // @version 0.0.3 // @description 在询盘页面,搜索按钮后面插入一个下载按钮,点击可以从头开始记录每个客户的分配记录,最终输出成JSON文件自动下载。 // @author Mike // @icon http://is.alicdn.com/favicon.ico // @match https://message.alibaba.com/message/* // @grant GM_addStyle // ==/UserScript== 'use strict'; var globalAllresult = []; var downloaded = false; var repeated = false; var pages = 0; // 下面这段代码生成下载方式 (function(console){ console.save = function(data, filename){ if(!data) { console.error('Console.save: No data found!') return; } if(!filename) filename = 'console.json' if(typeof data === "object"){ data = JSON.stringify(data, undefined, 4) } var blob = new Blob([data], {type: 'text/json'}), e = document.createEvent('MouseEvents'), a = document.createElement('a') //var text = await blob.text() a.download = filename a.href = window.URL.createObjectURL(blob) a.dataset.downloadurl = ['text/json', a.download, a.href].join(':') e = new MouseEvent ("click"); //e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null) !!!deprecated!!! a.dispatchEvent(e) } })(console) // 分配记录收集方法 function collectItems(){ var inquiryIds = document.getElementsByClassName('spec-inquiry-id'); var inquiryFlags = document.getElementsByClassName('ui2-flag'); //var levels = document.getElementsByClassName('aui-icon-buyer-level'); var customers = document.getElementsByClassName('spec-icon-wrap'); var result=[]; for (var i = 0; i < inquiryIds.length; i++) { console.log(inquiryIds[i].innerText,inquiryFlags[i].title); //console.log(levels[i]) var customer = customers[i].childNodes[3].src; console.log(customer) result.push({ 'inquiryId':inquiryIds[i].innerText, 'inquiryFlag':inquiryFlags[i].title, 'customer':customer }); } return result; } //与元数据块中的@grant值相对应,功能是生成一个style样式 GM_addStyle('#down_contacts_btn{color:#fb7d3c;}'); //下载按钮的html代码 var down_btn_html = '<span>'; down_btn_html += '<a href="javascript:void(0);" id="down_contacts_btn" class="S_txt2" title="一直点击,直到翻页到最后一页,自动下载,若无效请刷新重试">导出询盘国家</a>'; down_btn_html += '</span>'; var inner = document.createElement('span'); inner.innerHTML = down_btn_html; var down_input_html = '<span>'; down_input_html += '<input type="text" id="down_input" placeholder="页数" class="ui2-pagination-goto"</input>'; down_input_html += '</span>'; var inner_input = document.createElement('span'); inner_input.innerHTML = down_input_html; //将以上拼接的html代码插入到网页标签中 var ul_tag = document.getElementsByClassName('ui-dropdown-btn')[0].parentNode; console.log('ul_tag'); //console.log(ul_tag); if (ul_tag) { ul_tag.append(inner_input); ul_tag.append(inner); } var btn = document.getElementById('down_contacts_btn'); var type = document.getElementsByClassName('ui-dropdown-btn')[0].innerText btn.onclick = function(){ if (repeated) { confirm('请刷新页面后重试'); return; } if(downloaded) { repeated = true; return;//防抖,防止多次下载,刷新重启 } var nextBtn = document.getElementsByClassName('next')[0]; console.log(nextBtn); var ipt = document.getElementById('down_input').value; console.log('ipt:',ipt); if (undefined == nextBtn || (ipt-1) == pages){ console.log('没了'); let result = collectItems(); globalAllresult.push(result); globalAllresult = [].concat(...globalAllresult); if (type.indexOf('分配给') != -1) { console.save(globalAllresult,"InquiryCountry.json"); }else{ console.save(globalAllresult,"InquirySpam.json"); } downloaded = true; }else{ console.log('next page'); pages += 1 console.log('pages:',pages); let result = collectItems(); globalAllresult.push(result); nextBtn.click(); } }
2022年05月27日
5 阅读
0 评论
0 点赞
2022-05-25
Pandas常用函数之groupby()、agg()
import pandas as pd import numpy as np df = pd.DataFrame( data={ 'name': ['z_s', 'l_s', 'w_w', 'z_l', 'y_s', 'j_j', 'l_b', 'z_f', 'hs_q', 'lbl_k', 'qy_n', 'mg_n'], 'score': [100, 97, 98, 89, 67, 59, 29, 87, 78, 89, 88, 80], 'group': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], 'cls': ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'A', 'A', 'B', 'B', 'B'], 'height': [178.0, 180.0, 176.0, 182.0, 189.0, 190.0, 172.5, 175.0, 165.0, 160.0, 158.5, 159.0] }, index=['stu_' + str(i) for i in np.arange(1, 13, 1)] ) print('df:\n', df)Pandas分组聚合分组聚合统计各个班的最高的成绩:# 先按照班级进行分组,再统计各个组里面的成绩的最大值! ret = df.groupby(by=['cls'])['score'].max().reset_index() print('ret:\n', ret)多重行索引分组聚合统计各个班的各个小组的最高成绩# 先按照班级分组,再按照小组分组,最后统计各个小组内成绩的最大值 ret = df.groupby(by=['cls', 'group'])['score'].max() print('ret:\n', ret) print('index:\n', ret.index) # MultiIndex ---多重行索引 ret = ret.reset_index() # 重设索引 print(ret)对多列数据进行分组聚合统计各个班级的成绩、身高的平均值:# 按照班级分组,统计各个组内 成绩、身高的平均值 ret = df.groupby(by=['cls'])[['score', 'height']].mean().reset_index() print('ret:\n', ret)综合应用# 先按照班级分组、再按照小组分组---统计各个小组内的成绩的平均值、身高的平均值 ret = df.groupby(by=['cls', 'group'])[['score', 'height']].mean().reset_index() print('ret:\n', ret)聚合函数 agg统计成绩、身高的最大值、均值# 使用agg 方法 可以对多列数据一次性求出多个指标 ret = df.loc[:, ['score', 'height']].agg([np.max, np.mean]) print('ret:\n', ret)对多列数据统计不同的指标统计成绩的均值、同时统计身高的最大值# 使用agg 方法 可以对多列数据一次性求出多个指标 ret = df.agg({'score': [np.mean], 'height': [np.max]}) print('ret:\n',ret)对多列数据统计不同个数的指标统计成绩的均值、最大值、中位数 和 身高的均值# 使用agg 方法 可以对多列数据一次性求出多个指标 ret = df.agg({'score': [np.mean, np.max, np.median], 'height': [np.mean]}) print('ret:\n', ret)使用agg 方法也可以配合着 分组 对不同列、不同的数据、统计不同个数的 不同指标!ret = df.groupby(by=['cls']).agg({'height': [np.max,np.mean], 'score': [np.min]}) print('ret:\n', ret)agg调用 自定义函数ret = df.loc[:, 'score'].agg(lambda x: x + 1) print('ret1:\n', ret) def func_add_one(x): return x + 1 ret = df.loc[:, 'score'].agg(func_add_one) print('ret2:\n', ret) # 对多列 使用自定义函数 ret = df.loc[:, ['score', 'height']].agg(func_add_one) print('ret3:\n', ret)使用agg 调用numpy的统计指标# 统计所有同学成绩的和 ret = df.loc[:, 'score'].agg(np.sum) print('ret:\n',ret) print('type:\n',type(ret)) # # 统计所有同学 成绩以及身高 的和 ret = df.loc[:, ['score', 'height']].agg(np.sum) print('ret:\n', ret) print('type:\n',type(ret)) # 统计身高 + 成绩(无意义的,只是为了演示能够 同一行相加) ret = df.loc[:, ['score', 'height']].agg(np.sum, axis=1) # 使用axis指定相加的方向 print('ret:\n', ret) print('type:\n',type(ret))
2022年05月25日
7 阅读
0 评论
0 点赞
2022-05-23
Pandas常用函数之rename()
df.rename()df.rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None)index,columns:表示待转换的行索引和列索引。axis:表示轴的名称,可以使用index或columns,也可以使用数字0或1。copy:表示是否复制底层的数据,默认为False。inplace:默认为False,表示是否返回新的Pandas对象。如果设为True,则会忽略复制的值。 //相当于是否创建副本修改数据,还是直接在原数据直接修改level:表示级别名称,默认为None。对于多级索引,只重命名指定的标签。import pandas as pd #重命名轴索引 df=pd.DataFrame({'A':['A0','A1','A2','A3'] ,'B':['B0','B1','B2','B3'] ,'C':['C0','C1','C2','C3']}) df.rename(columns={'A':'a','B':'b','C':'c'},inplace=True) #columns可以接受一个字典, 键为 旧索引 ,值为 新索引 df.rename(index={1:'a',2:'b'}) # index 也可以接受一个字典,键为 旧索引 ,值为 新索引可以用lower方法把字符串变成小写:import pandas as pd jk=pd.DataFrame({'A':['A0','A1','A2','A3'] ,'B':['B0','B1','B2','B3'] ,'C':['C0','C1','C2','C3']}) jk.rename(str.lower,axis='columns') #使用str中的lower()方法把字符串变成小写,根据 axis 指定变得地方,是要求是字符串才能变
2022年05月23日
3 阅读
0 评论
0 点赞
1
...
5
6
7