古人云:温故而知新。最近把pandas的一些常用的方法以及一些处理文件的常用命令用法总结了一下,因为再不复习就真忘了。
01
—
pandas
Q1:有时候列数很多,不可能手动输入列名,可能直接利用默认生成的列名进行切片等操作。
f1.iloc[1:3,4:6]
#这是取f1的1,2行中的4,5列,不包括结束点的索引行或列
#如果要取全部行,前后范围都不用写,但冒号不可省。
Q2:如果是直接用DataFrame函数生成DF,为列命名用columns=(),如果用pd.read_table等从文件读取,列命名用names=()
a={'a':[1,2,3],'b':['zy','wd','sd']}
f = DataFrame(a,columns=['b','a'])
#对某一列修改值,在上面取列的基础上用 = 赋值
Q3:对Series和DataFrame进行索引重排reindex的问题
对索引的重排不在原始数据上修改,赋值到一个新的Series或DataFrame
对于不存在的索引对应的值为NA
对于Series
obj = Series([12,34,2423],index = ['a','c','g'])
on = obj.reindex(['c','g','d'])
print(on)
#fill_value=4:把NA填成4
#method=ffill/bfill:对于重排加入的新索引对应的值,依照它前面的值填充还是依照后面的值
对于DataFrame
在reindex的时候是要求原Dataframe的index是排序的,才能用method=“ffill/bfill”,所以如果原df的index的不是排序的,那么就会报如下错!
index must be monotonic increasing or decreasing
解决方法:
要么在reindex之前加上sort_index()。这样会影响ffill的填充~,因为是按照sort_index()排序之后的填充,然后按照reindex的顺序输出,所以可能表面上看新增的一行可能并不直接是他上一行的数据。
如果不想对index 进行排序,使用ffill(),那么不要使用method = "ffill",直接在括号最外面写.ffill(),这样可以不需要对原DF的索引进行排序就可以按照reindex的顺序进行ffill()
Q4:举例:筛选出data中列a大于5的数据出来
df1=data[data['a']>5]
#筛选出列a大于5的行
#data['a']>5是一个布尔型的返回值
这个算是一个比较常用且好用的方法了~
Q5:如何操作两个DataFrame进行运算?
两个series进行对齐,没有对应索引的相加后为NA
DataFrame:要索引和列都对应才能进行运算,不对应(没有重叠)的都为NA
s1={'a':13,'b':20}
a=Series(s1)
s2={'b':30,'c':20}
b=Series(s2)
c=a+b
print(c)
# 这个Series和DataFrame的用法一致,直接用+—就可以了
# 接下来可以使用dropna()来删除na所在的行或列
直接让两个DataFrame相加减,对于不对应的行列会产生NA值,如果想对NA值进行赋值,可以采用另一种方法。
df1.add(df2,fill_value=0)
# 相对应的加减乘除依次是:add/sub/mul/div
Q6:根据DataFrame的某一列进行排列
df.sort_index(by="a")
#表示按照列a排序。
# 根据多个列排序,可以传给by一个列表
Q7:对DataFrame的行或者列求和,最大值,最小值,均值
a=df.sum(axis=1)
# sum() mean() max() min()
对dataframe来说,可以求所有行或者列的sum,也可以求特定行或者列的sum
这里NA会被自动排除,如果一行或者一列全部是NA的话,则为NA
如果想实现:有一个NA则全部为NA的情况,可以使用skipna=False参数实现
02
—
处理文件的常用命令
「1」合并文件
cat将两个文件合并,列数不变,行数增加
paste将两个文件合并,行数不变,列数增加
「2」os库的使用
os.path.join()
用来合并路径,多个参数:如果有'/'开头的参数,从最后一格‘/’开始连接
# -*- coding:utf-8 -*-
import os.path as op
path="/home/zy"
a=op.abspath(path)
#返回path在当前系统中的绝对路径
c=op.join('/aaaa','bbbb','/ccccc.txt','/sdasdasd')
c1=op.join('/bbbb','ccccc.txt','./sdasdasd.txt')
print(c)
print(c1)
#---------结果----------
#/sdasdasd
#/bbbb/ccccc.txt/./sdasdasd.txt
几个常用判断:
os.path.exist()
os.path.isfile()
os.path.isdir()
os.walk()
是可以得到向前路径path下所有的文件,包括所有的子文件里的内容。
返回的是一个三元组
for root,dir,file in os.walk(path):
#可以得到子文件夹里的内容
for i in dir:
print(os.path.join(root,dir))
#file相同的用法
os.listdir()
只得到当前path下的目录和文件,用法比较方便,目录和文件都在下面的i中,所以对于输出,可以用一个判断来筛选只输出文件或目录。
for i in os.listdir(path):
for y in i:
print(y)
#如果只想输出文件或者目录
#os.path.isdir()
#os.path.isfile()
「彩蛋」之前一直想写一个进度条,查到了tqdm这个python包,一直没理解精髓,最近再看是豁然开朗,原来很简单。
通常用在for循环上,在列表前面加上tqdm即可.
对于没有for循环列表的情况,可以依靠”站在上帝视角“解决问题。
可以通过构建函数或类,然后将参数输入成列表
# -*- coding:utf-8 -*-
import os
from tqdm import tqdm
import time
class mina:
def __init__(self,a):
b=a-10
if __name__=='__main__':
b=list(range(10000000))
for i in tqdm(b):
mina(i)