Python的DataFrame摘要

作者:, 发表于

Python数据分析工具pandas中以DataFrame和Series作为主要的数据结构。

Series是一个数据序列。DataFrame是一张数据表(可以理解由多个Series构成,每个Series为一列)。DataFrame和Excel和数据库的数据表类似(实际结构更复杂,因为支持多重索引),因此可以对其做类似Excel数据表的排序、筛选、聚合、透视表等操作,也可以做类似于数据库数据表的多表关联(join)等操作。

1.建立DataFrame对象

df = pd.DataFrame() #创建DataFrame对象 
df = pad.DataFrame([[1,2],[3,4]], columns=list('AB'))

1.1.从文件读入

df = pandas.read_json('abc.json')
df = pandas.read_csv('abc.csv', sep=';', nrows=2) # 首先输入csv文本地址,然后分割符选择等等

1.2.保存到文件

df.to_csv('abc.csv', encoding="utf8") # 要支持中文,python2必须指定encoding。python3已默认使用utf8
df.to_excel('foo.xlsx',sheet_name='Sheet1');pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])#写入读取excel数据,pd.read_excel读取的数据是以DataFrame形式存储
df.to_hdf('foo.h5','df');pd.read_hdf('foo.h5','df')#写入读取HDF5数据

2.查看DataFrame数据及属性

df.dtypes #查看各行的数据格式
df['col1'].astype(int)#转换某列的数据类型
df.head() #查看前几行的数据,默认前5行
df.tail() #查看后几行的数据,默认后5行
df.index #查看索引
df.columns #查看列名
df.values #查看数据值
df.describe() #描述性统计
df.T #转置

3.选择数据

df[1:-3] # 获取1到倒数第三行
df.ix[1:3] # 同上 
df.ix[1:3,[1,3]]#获取1列3列的1~3行数据
df['c1'] # 选择列
df.c1 # 效果同上
df.columns[[0,1,3]] # zero indexed

需要注意DataFrame取下标和索引速度非常慢,不建议对其做for循环操作,若要做循环操作,建议两种替换方案,一种使用内建函数(apply、map、trasnform)等,另外一种将每列Series转为list之后处理(col_list = df.col.tolist())。

4.筛选数据(保留对应的行)

alist = ['023-18996609823']
df['code'].isin(alist) #将要过滤的数据放入字典中,使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回ture
df[df['code'].isin(alist)] #获取匹配结果为ture的行
df[df.value>0]
df[df['plan'].str.contains(r'.*?语音CDMA.*')] #使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次

5.删除数据

df[columns].drop_duplicates() #剔除重复行数据
df[df.isnull()]
df[df.notnull()]
df.dropna()#将所有含有nan项的row删除
df.dropna(axis=1,thresh=3) #将在列的方向上三个为NaN的项删除
df.dropna(how='ALL')#将全部项都是nan的row删除填充值

5.1.删除特定列

del df.col1  # 删除列 inplace
df = df.drop('column_name', 1) # 返回删除后的新的DataFrame
df.drop('column_name', axis=1, inplace=True)
df.drop([df.columns[[0, 1, 3]]], axis=1, inplace=True)   # Note: zero indexed

6.修改数据

6.1.修改列名

df.rename(columns={'A':'a', 'C':'c'}, inplace=True)
df.columns = ['A', 'B', 'C']

 

df.c
df.fillna(0)
df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5
df.fillna(method='ffill') #df
df.ix[1:3,[1,3]]=1#所选位置数据替换为1   
df['支局_维护线'] = df['支局_维护线'].str.replace('巫溪分公司(.{2,})支局','\\1')#可以使用正则表达式

6.2.新增列

df['new_column'] = df['old_column']   # 新增了一列 
df.new_column = df['old_column']      # 这样不会新增列,只会跟原列起了个别名引用

7.apply

df.apply(lambda col: sum(col), axes=0) # 对每列求和
df.apply(lambda row: sum(row), axes=0) # 对每行求和
df.col2 = df.col1.apply(lambda col: sum(col))    # 对col1列求和
df.col3 = df.col3.apply(lambda x: x+1) # col3列都加1
df = df.applymap(lambda x:x+1) # 每个元素都加1
df.transform(lambda x:x+1)     # 效果同上,相当于inplace的applymap

8.聚合数据(类似SQL中的GROUP BY 或HAVING):

df.groupby(['col1', 'col2']) # 将数据
 data_obj.groupby('支局_维护线')['用户标识'] #上面的简单写法
 adsl_obj.groupby('支局_维护线')['用户标识'].agg([('ADSL','count')])#按支局进行汇总对用户标识进行计数,并将计数列的列名命名为ADSL

9.透视表

df = df.pivot(index='A', columes='B', values='C') # 先聚合再透视。
table = pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=np.sum) # 复杂一点的,支持同时聚合

10.合并数据集(类似于数据库的union/union all)

df1 = df1.append(df2) # df2放在df1后面,注意append会返回一个新的对象,不是在原对象上修改。
df = pandas.concat([df1, df2], ignore_index=True) # 等价于append

11.Join数据集(类似于数据库的left/right/inner/outer join)

df = pandas.concat([df1, df2], axis=1) # 和sql的join类似,on index_key
merge(df1, df2, on='abc',how='inner')# df1和df2将用户标识当成重叠列的键合并两个数据集,inner表示取两个数据集的交集.
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False)

12.排序

df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')

13.画图

Q.E.D.


上一篇:网站访问速度优化2015年1月11日
博客迁移到阿里云后,性能和带宽都很差,采取各种方法提升访问速度:全站静态化、使用CDN静态哭、使用图标字体、启用InstantClick、全站启用CDN。

下一篇:Python的numpy摘要2017年1月14日
numpy是python的(事实)标准矩阵库,很多其它库(比如pandas, sklearn)都以numpy为数值处理对象,因此也是其它库的基础。 属性 arr.shape # 等价于matlab的si


  • 支持使用微薄、微信和QQ的账户登陆进行评论。由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论提交后无法修改。如需修改,请删除原评论再重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。