美文网首页
pandas用法归纳+简单的文件处理命令

pandas用法归纳+简单的文件处理命令

作者: Minka__ | 来源:发表于2019-05-20 12:37 被阅读0次

古人云:温故而知新。最近把pandas的一些常用的方法以及一些处理文件的常用命令用法总结了一下,因为再不复习就真忘了。

image

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将两个文件合并,行数不变,列数增加

image

「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)
image

相关文章

网友评论

      本文标题:pandas用法归纳+简单的文件处理命令

      本文链接:https://www.haomeiwen.com/subject/wdxkzqtx.html