分类目录归档:爱PYTHON

使用Pandas解决数据处理问题

今天星期天,突然接到朋友电话需要帮忙解决数据处理问题。今天要求解的问题,听起来很简单,就是将数据【姓名、日期、金额】中同一个人日期排最后的那一笔数据筛选出来。

最开始使用的是excel处理,使用文心一言帮忙,给出的方案是:
{MAX( IF(姓名列=当前姓名,日期列) )},结果准确。

使用Pandas也进行了一次尝试,果然是python强大,使用更简单的语句就解决了问题。
import pandas as pd # 读取CSV文件
df = pd.read_xls('data.xlsx') # 按照身份证号和支付日期排序
df = df.sort_values(by=['姓名', '日期']) # 根据身份证号分组,并选择每个组的最后一行数据
df = df.groupby('姓名').last().reset_index() # 保存结果到Excel文件
df.to_excel('result.xlsx', index=False)

一次较大规模数据处理的经历 PYTHON版

前一段时间遇到了一次数据处理的问题,原始数据是CSV数据(逗号分隔),近百万条,要根据不同的公式对每一条进行计算。在使用EXCEL进行计算时,只要一动就会重新计算,而且时常出现无响应的状态,有好几次强行关闭导致重头再来。

考虑到数据量大,使用EXCEL计算可能不适合,才导致不停地死机。最初打算使用数据库来计算,没有数据量的限制,在查询和更新的时候速度很快。但是每一行计算的时候,对于结果不是简单地赋值,而是分段乘以比例再累加计算(类似于电费阶梯计算),思来想去,不知道如何使用SQL语句实现,有可能需要很多个不同的语句。与其这么麻烦,不如写程序来实现,于是打算使用现在很流行的PYTHON语言来处理,一是简单易学,二是有丰富的模块,说不定就有解决该问题的方法。

经过了解,有一个模块PANDAS能够方便的处理CSV数据,而且非常灵活,打算试一试,最终成功解决了问题,现将过程记录以便以后再使用。 继续阅读一次较大规模数据处理的经历 PYTHON版

PYTHON学习之sorted函数

PYTHON是一种非常灵活的语言,可以用来快速开发,语言简洁,而且功能强大,最近在处理数据时遇到了排序的问题,使用了SORTED函数,不得不感叹PYTHON的强大。

问题描述:遍历输出一个字典数据,输出前按照KEY的第9至12位数据进行排序。

第一步,认识sorted函数

Sorted可以对所有的可迭代对象进行排序,在PYTHON中,list、tuple、set、dict等数据结构都是可迭代的对象,因此都可以使用sorted函数进行排序,尤其是要进行遍历输出的时候,非常方便。sorted的语法是:

sorted(iterable, key=None, reverse=False)

iterable是可迭代的对象,key是排序的关键字,reverse是排序的顺序,默认是升序

第二步,认识lambda函数

lambda是匿名函数,不用单独定义,使用起来方便,正常的函数必须先定义,再使用。而lambda只用简单定义,即可实现一个函数的功能。

常规函数的定义和使用:

def sum(x,y):
    return x+y

result=sum(5,3)

使用lambda定义匿名函数:

sumFunc=lambda x,y:x+y
result=sumFunc(5,3)

第三步,解决问题

所要排序的数据时一个字典,排序的依据是KEY中的第9至12位数据,然后输出字典里面的数据。

for item in sorted(myDict,key=lambda item:item[9:12])
    print(item,myDict[item])

PYTHON数据结构学习之RANGE

程序有三种控制结构,顺序、循环和选择,顺序就是1、2、3、4一条一条地执行,循环对一个集合的每一个元素进行操作,选择则是有条件地执行语句。在C、JAVA之类的语言中,循环语句常见的有for,for(i=0;i<n;i++){}就是循环n次,执行{}里面的内容。但是在PYTHON中for语句不是这样写的,通常的写法是for i in range(10),那么range是什么意思呢,今天就来学习一下。

for i in range(10),首先range是一个对象,也是一个序列,因此能够使用in 这个关键字,意思是在某某里面,for 对于range对象里面的每个元素进行遍历。

一、RANGE的创建
range(stop)                       #默认从0开始,小于等于stop-1
range(start,stop[,step])     #按照开始、结束生成序列,步长可以设置,相当于[0,stop),含前不含后,下面是一些例子。start没填,默认为0,step默认为1。
data=range(10)               #创建序列[0,10)
data=range(0,10)            #创建序列[0,10)
data=range(0,10,2)         #创建序列[0,10),步长为2

二、RANGE的方法
data.count(3)                 #统计元素3出现次数
data.index(3)                  #返回元素3的位置
data.start                        #range的起始值(含)
data.stop                        #range的终止值(不含)
data.step                        #range对象的步长

三、其他FOR循环方式
刚才说过,for i in range(19),range只是序列,因此这不是唯一的表达方式:也可以用下面几种:
for i in range(10)
for i in (0,1,2,3,4,5,6,7,8,9)
for i in [0,1,2,3,5,6,7,8,9]

PYTHON数据结构学习之元组TUPLE

上次学习了列表LIST,这次学习元组TUPLE,这两个数据结构非常像,可以说TUPLE跟列表一样,只不过是不能修改的。因此如果存储常量时,可以使用元组,不用担心数据被修改。但是如果存储的某个元素是列表,那么这个列表中的元素是可以修改的。

1 创建元组
arr=()              #创建一个空元组
arr=tuple()     #创建一个空元组
arr=1,             #创建元组,只有1
arr=(1,)           #创建元组,只有1
arr=tuple([1,2,3]) #从可迭代数据创建
也就是说,创建元组时,逗号很关键,可以没有括号,但是得有逗号。

2 元组的方法
LIST有很多方法,TUPLE与列表类似,但是它是只读的,因此方法很少,没有添加和修改元素的方法。
arr.count(1)       #统计元素1的个数
arr.index(1)       #查找元素1的位置

3 元组的其它方法
元组和列表一样,属于可迭代类型数据,因此有一些通用方法,比如min,max,sum,x in arr,x not in arr等操作。

4 元组的遍历
遍历方面,与列表相同。

PYTHON登录FTP服务器下载文件

最近需要定时从FTP服务器上面下载文件,做简要分析,由于是日常工作,工作量大,但是没有技术含量,纯粹是消耗时间,于是决定尝试使用PYTHON写程序,每天自动下载。使用FTP下载的方法很多,使用PYTHON写程序之前用过两种方法,一种是用我的电脑打开FTP,登录之后复制想要的文件;第二种是使用DOS批处理文件来下载,第二种比第一种效率要一些。下面就来说说这些下载方法:

一、我的电脑访问
这种方法最简单,直接在我的电脑地址栏中输入FTP服务器地址,输入用户名和密码,就可以下载所需的文件。缺点是,每天都需要打开一次,输入用户名和密码,一次使用可以,每天都这样还是比较繁琐的。

二、DOS批处理
将FTP服务器地址、用户名、密码,以及文件存放的目录等内容保存好,一运行,就能自动登录,并下载所需的文件。该方法需要写两个bat文件,getFtpData.bat用于保存FTP命令,main.bat用于调用getFtpData.bat文件,使用该方法非常简单。

getFtpData.bat:
open ***.***.***.**
user username password
cd data
get plan1.csv
get plan2.csv
get plan3.csv
bye

main.bat:
ftp -n -s:”getFtpData.bat”
继续阅读PYTHON登录FTP服务器下载文件

Python操作Excel类库Openpyxl之初体验

以前尝试过通过win32com方式读写excel,Win32com调用Excel是最好的一个方式,因为直接调用的是windows平台的软件,可靠性要高一些,另外excel出错的可能性也小一些。由于win32com包怎么也找不到,于是这次尝试使用openpyxl类库读写excel,选择openpyxl的原因在于它能够读取和写入Excel文件,相对于xlrd、xlwt方便一些。

1 安装openpyxl

安装方法非常简单,直接使用pip即可:
pip install openpyxl
它能自动下载和安装openpyxl所依赖的包,然后再安装openpyxl。
但是本人使用的机器是离线的,因此只能采用离线安装的方式,经过尝试,需要下载以下安装包:
et_xmlfile
jdcal
openpyxl
上面三个安装依次下装并安装,注意版本,比如Openpyxl最新版本号是3.0.5,那么et_xmlfile和jdcal下载时应注意版本号,否则会出错。不过出错也没关系,因为出错信息中会提示所依赖包的版本号,重新下载一遍也没关系。

2 操作Excel
2.1 导入openpyxl
继续阅读Python操作Excel类库Openpyxl之初体验

PYTHON学习:使用POP3协议下载邮件

以前使用电脑端访问邮箱时,知道有POP3、SMTP协议,随首技术的发展,最近又有了很多种选择,尤其是手机端,看到了每多种连接方式,比如IMAP、EXCHANGE方式,邮件还带同步的,比如电脑端改变了邮件,手机端也同步了,因此想写几篇文章学习一下这些协议和新的技术,此次看的是POP3协议。
POP3是Post Office Protocol – Version 3的简写,中文意思是简单邮局协议(版本3),它是由RFC1939文件描述的。POP3协议的作用是动态地从服务器上下载邮件,然后删除服务器上的邮件(新版的POP3可以不删除),除此之外,POP3协议并没有提供更多的对于邮件的操作。相应的,有一种更高级的IMAP4协议,能够支持对邮件更多的操作。
下面是POP3协议所支持的命令:

命令
描述
USER [username]
处理用户名
PASS [password]
处理用户密码
APOP [Name,Digest]
认可Digest是MD5消息摘要
STAT
服务器发回关于邮箱的统计资料,如邮件总数和总字节数
UIDL [Msg#]
处理返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的
LIST [Msg#]
处理返回邮件数量和每个邮件的大小
RETR [Msg#]
处理返回由参数标识的邮件的全部文本
DELE [Msg#]
处理服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET
处理服务器将重置所有标记为删除的邮件,用于撤消DELE命令
TOP [Msg# n]
处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数
NOOP
服务器返回一个肯定的响应
QUIT
终止会话

继续阅读PYTHON学习:使用POP3协议下载邮件

PYTHON学习:行的划分和注释

PYTHON程序由一系列逻辑行组成,每一逻辑行由NEWLINE结尾,同时,逻辑行又由物理行通过显示或者隐式连接组成。物理行由一系列字符组成,以换行符结尾,换行符在UNIX系统中是LF,在WINDOWS系统中是CR LF,在Machintosh系统中用CR来表示,无论什么平台,这些行结尾符号都可以使用,没有区别。
先看看显式得连接不同的行,也就是一行写不完如何换行写程序,在写程序时,有可能一行写不完,如果直接回车换行再写,会出错,正确的做法是在要换和f的地方输入\,然后在下一行接着写,否则就会出错:
if 1900 < year < 2100 and 1 <= month <= 12 \
and 1 <= day <=31
return 1
隐式地连接不同的行,是指系统自动地认为不同行的内容为同一个逻辑行的情况,这些情况是指在一对括号、花括号、中括号中的内容,不用\换行:
month_names = [‘Januari’, ‘Februari’, ‘Maart’,
‘April’,   ‘Mei’, ‘Juni’  ] 继续阅读PYTHON学习:行的划分和注释

PYTHON学习:不同的PYTHON实现

PYTHON有很多不同的实现,每种实现都有一系列的内置和标准的模块,最常见的是CPython,也就是大家常常说的Python,但同时PYTHON还有很多种实现,这些不同的实现满足了不同的使用者的需求,面就是PYTHON的几种常见的实现:
CPython 是最原始、维护得最多的一种PYTHON实现,使用C语言编写,每当有新的特点、特性出现时,CPython最先更新。
Jython 是在JAVA中实现的PYTHON,这种实现可以当作JAVA应用的一个脚本语言,或者可以用来创建调用JAVA类库的应用,它常常用来创建JAVA类库的测试程序。
Python for .NET 使用了CPython的实现方式,与CPython不同的是它是一个可管理的.NET应用,可以使用.NET类库。
IronPython 也是一种.NET实现的PYTHON,与Python for .NET不同,它能够将Python代码编译成.NET汇编。
PyPy 完全使用Python实现的Python,它支持其它几种实现都没有的特性,比如StacklessJust in Time compiler,这使得它的运行速度比CPython快,也可以安全得运行一些不被信任的代码。