看来工作上需要什么,才有驱动力去学习什么~

import pandas as pd

读写csv数据

read_csv()

df = pd.read_csv(path)

读入csv文件,形成一个数据框,data.frame

不要把第一行作为header

df = pd.read_csv(path, header=None)

to_csv()

注意,默认会将第一行作为header,并且默认会添加index,所以不需要的话需要手动禁用

df.to_csv(path, header=False, index=False)

数据框操作

df.head(1) 读取头几条数据

df.tail(1) 读取后几条数据

df['date'] 获取数据框的date列

df.head(1)['date'] 获取第一行的date列

df.head(1)['date'][0] 获取第一行的date列的元素值

sum(df['ability']) 计算整个列的和

df[df['date'] == '20161111'] 获取符合这个条件的行

df[df['date'] == '20161111'].index[0] 获取符合这个条件的行的行索引的值

df.iloc[1] 获取第二行

df.iloc[1]['test2'] 获取第二行的test2值

10 mins to pandas

df.index 获取行的索引

df.index[0] 获取第一个行索引

df.index[-1] 获取最后一个行索引,只是获取索引值

df.columns 获取列标签

df[0:2] 获取第1到第2行,从0开始,不包含末端

df.loc[1] 获取第二行

df.loc[:,'test1'] 获取test1的那一列,这个冒号的意思是所有行,逗号表示行与列的区分

df.loc[:,['test1','test2']] 获取test1列和test2列的数据

df.loc[1,['test1','test2']] 获取第二行的test1和test2列的数据

df.at[1,'test1'] 表示取第二行,test1列的数据,和上面的方法类似

df.iloc[0] 获取第一行

df.iloc[0:2,0:2] 获取前两行前两列的数据

df.iloc[[1,2,4],[0,2]] 获取第1,2,4行中的0,2列的数据

(df[2] > 1).any() 对于Series应用any()方法来判断是否有符合条件的

2016-12-8 15:46

排序

DataFrame.sort(columns=None, axis=0, ascending=True, inplace=False, kind='quicksort' na_position='last')

  • columns是要排序的列名称
  • axis为排序的轴,0表示index,1表示columns,对数据列进行升序时,axis必须为0
  • ascending表示排序方式,true是升序,false为降序
  • inplace表示对数据进行排序,不创建新实例
  • kind为排序方式,快速排序
  • na_position是NaN处理方式,first放在排序开头,last放在排序结尾

对单列数据进行排序

df.sort(["date"])

升序:df.sort(['date'], ascending=True)

对多列数据进行排序

降序:df.sort(['date', 'fundId'], ascending=False)

获得最小的前10项

df.sort(['date'], ascending=True).head(10)

获得最大的前10项

df.sort(['date'], ascending=True).tail(10)

筛选

DataFrame.loc

单列数据筛选并且排序

df.loc[df['date'] == 20160101].head()

或者可以

df[df['date'] == 20160101].head()

但是loc可以显示指定的列显示

df[df['date'] == 20160101, ['date', 'id', 'type']].head()

使用sort

df[df['date'] == 20160101, ['date', 'id', 'type']].sort(['id']).head()

多列数据筛选并且排序

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"]>5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

排序

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"])

按筛选条件求和

lc.loc[lc["grade"] == "B",].loan_amnt.sum()

按筛选条件计数

lc.loc[lc["grade"] == "B"].loan_amnt.count()

按筛选条件计算均值

lc.loc[lc["grade"] == "B"].loan_amnt.mean()

按筛选条件获取最大值和最小值

lc.loc[lc["grade"] == "B"].loan_amnt.max()

loc ix iloc区别

loc-通过行标签索引行数据

  • loc[1]表示索引的是第一行
  • loc[‘d’]表示索引的是第’d’行
  • loc可以获取多行数据 df.loc['d':]
  • 索引某行某列 df.loc[1, [2, 3]]
  • 索引某列 df.loc[:, ['c']]

注意:df.loc[1:2]是第一行和第二行

iloc-通过行号获取行数据

要获取哪一行就输入该行数字,df.iloc[1]会返回一个Series,但是df.iloc[1:2]会返回一个只包含第一行的数据框

通过iloc索引列数据,df.iloc[:, [1]]

ix-前两种的混合索引

  • 通过行号索引 df.ix[1]返回Series, df.ix[1:2]返回第一行和第二行的数据框
  • 使用行标签索引 df.ix['a']

Ipython

  • table键自动补全
  • 内省?
  • %run命令运行脚本 %run test.py
  • 中断正在执行的代码
  • 执行剪贴板的代码 %paste or %cpaste
  • %timeit 检测执行时间

快捷键

  • ctrl+a 移动到行首
  • ctrl+e 移动到行尾
  • ctrl+k 从光标处删除到命令行尾
  • ctrl+u 从光标处删除到命令行首

交互式调试器

%debug 在发生后马上输入,将会调用事后调试器,并且直接跳转到引发异常的那个栈帧,使用u或者d在栈跟踪的各个级别之间切换

%pdb命令可以在Ipython出现异常后自动调用调试器

设置断点对函数进行单步调试查看各条语句的执行情况

使用-d选项的%run命令,在执行脚本文件的代码之前先打开调试器,立即输入s才进入脚本,c使脚本一直运行下去直到该断点,n直接执行到下一行,调试器命令优先变量名,在变量名中加入!查看其内容

1
2
3
4
5
6
b number 在number行设置断点
s 单步进入函数调用
n 执行当前行
a 打印当前函数的参数
debug statement 在新的递归调试器中调用语句statement
q 退出调试器

测试代码执行时间%time%timeit

%time 一次执行一条语句,报告总体执行时间

%timeit 自动多次执行以产生一个精确的平均执行时间

基本性能分析%prun%run -p

cProfile模块,在执行一个程序或者代码块的时候,会记录各函数所耗费的时间

将执行整个程序然后输出各函数的执行时间

python -m cProfile test.py

增加-s指定排序规则

python -m cProfile -s cumulative test.py

cumtime列发现各函数所耗费的总时间

使用Ipython %run -p -s cumulative test.py

使用%lprun对一个或者多个函数进行逐行性能分析

%prun宏观性能分析,%lprun微观性能分析