一.基本知识
有两个主要的数据结构,Series和DataFrame,记住大小写区分。
导入库方法:import pandas as pd
1.Series类似于一维数组,和numpy的array接近,由一组数据和数据标签组成。数据标签有索引的作用。数据标签是pandas区分于numpy的重要特征。
(1) 用列表list创建Series
s=pd.Series([1,2,3,4,])
s
0 1
1 2
2 3
3 4
dtype:int64
左边是数据索引index,即标签,右边是数据。索引index默认从0到n,也可以指定index。
s=pd.Series([1,2,3,4],index = [‘a’,‘b’,‘c’,‘d’])
(2) 用字典dict来创建Series
S=pd.Series({‘A’:1,’B’:2,’C’:3,’D’:4})
(3) 用numpy array创建Series
S = pd.Series(np.random.randn(5),index=[‘a’,’b’,’c’,’d’,’e’]
Series数据索引切片与list相似。
2.DataFrame是一个表格型的数据结构,它含有不同的列,每列都是不同的数据类型。我们可以把DataFrame看作Series组成的字典,它既有行索引也有列索引。DataFrame会自动补充索引,并且将字典的key作为列标签,即column。在这里,dict的key顺序是DataFrame的顺序,不再是无序的。
df = pd.DataFrame(np.random.randn(3, 4), index=['a','b','c'],columns=list('ABCD'))
df
A B C D
a -0.493069 -1.259966 0.957297 0.834428
b 0.077725 1.622198 1.118242 0.926442
c -0.482049 0.009130 0.464322 -0.789371
二.常用方法
【数据信息查看】
df.shape:维度查询
df.dtypes:每一列数据的格式
df[‘A’].dtype:某一列数据格式
df.isnull():查看整个df的空值情况,False表示非空值,True表示空值
df[‘A’].isnull():查看某一列的空值情况,False表示非空值,True表示空值
df.notnull():查看整个df的非空值情况,False表示空值,True表示空非值
df[‘A’].notnull():查看某一列的空值情况,False表示空值,True表示非空值
df.index:查看行名称
df.columns:查看列名称
df.values:查看数据表的值
df.info():数据表基本信息(维度、列名称、数据格式、所占空间等)
df.describe():针对数值数据,计算字段有count(非空值数)、mean(平均值)、std(标准差)、min(最小值)、max(最大值)、25%(25%分位数)、50%(50%分位数即中位数)、75%(75%分位数)、max(最大值)
df.head():默认查看前5行数据,()内可以指定其他行数。
df.tail():默认查看后5行数据,()内可以指定其他行数。
【导入导出文件】
导入csv文件:从name.csv文件中导入数据,header=1表示带有标题,sep表示数据分隔符为空格,默认分隔符为逗号。
df = pd.DataFrame(pd.read_csv(‘name.csv’,header=1,sep=’ ’,))
导入xlsx文件:从name.xlsx文件中导入数据,header=None表示不带标题,默认分隔符为(‘\t’)
df = pd.DataFrame(pd.read_excel(‘name.xlsx’,header=None))
导出csv文件:导出数据到E盘为result的csv文件,index=True表示文件有索引名称,encoding=’gb2312’中文编码,不会出现乱码。
df.to_csv(’E:\\result.csv‘,index=True,encoding=’gb2312’)
导出xlsx文件:导出数据到xlsx文件。
df.to_xlsx(’E:\\result.csv‘,index=True,encoding=’gb2312’)
【数据清洗】
df.drop(‘A’,axis=1,inplace=True):删除A列数据,axis=1表示列,axis=0表示行,默认是行。inplace=True表示不创建新对象,直接对原始对象进行修改,inplace = False:对数据进行修改,创建并返回新的对象承载其修改结果。默认是False。
del df[‘A’]:直接删除A列数据。
df.dropna():滤除带缺失数据的行,缺失数据指所谓的空值,没有数值。pandas使用NaN作为缺失数据的标记。
df.dropna (axis=0, how=‘any’, thresh=None, subset=None, inplace=False):axis默认为0,可以省略。how=’any’表示只有有缺失值,就删除,’all’表示所有的值都缺失才删除,默认为any可以省略。thresh=n表示保留至少n个不是NaN的行。subset删除特定列的缺失值。inplace同上。
df.dropna(axis=0,,how=’all’,subset = ["A", "B"]) # 删除A,B列中全为缺失值的行。
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs):填充数据。value表示要填充的数据,method有‘backfill’/‘bfill’(使用后一个值填充缺失值), ‘pad’/‘ffill’(使用前一个值填充缺失值), None}几种方法,默认是None。Limit填充缺失值个数限制。
df.fillna(value={‘A’:10}) # 填充A列的缺失值为10.
df.drop_duplicates(subset=None,keep=’first,inplace=’False’):删除重复数据。keep有‘first’, ‘last’, 默认为 ‘first’,删除重复项并保留第一次出现的项。subset,inplace同上。
df.drop_duplicates(‘A’,’first’,inplace=False) # 删除A中的重复性,保留第一个出现的项。
df[‘A’].map(str.strip()):map()根据提供的函数对指定序列做映射,即把A列每个数据的字符串前后空格及\n \t之类删掉。
df[‘A’].str.lower():大小写转换。将A字段中的字符转为小写。
df[‘A’].str.upper():大小写转换。将A字段中的字符转为大写。
df[‘A’].astype(‘int’):更改数据格式。将A中的数据格式改为int
df.rename(columns={‘A’:’A1’}):更改列名称。将列’A’名称改为’A1’
df[‘A’].replace(‘h’,’hello’):数据替换。将A中的’h’替换为’hello’
【数据索取切片】
1.单个数据索引切片
行索引:df.loc[‘a’]或者df.iloc[0]都可以实现数据行索引,但是行索引不能用df[0]。
列索引:df[‘A’] 或者 df.A都可以实现数据列索引,其结果输出是Series。
2.多个数据索引
行索引
df[‘a’:’b’]或df[0:2]或df.loc[‘a’:’c’]或df.iloc[0:2]:用于从index=’a’到index=’b’的行切片索引,左右都包含。也可以用df[0:2],其等价于df[‘a’:’b’],需要注意的是数字索引依然是左闭右开。
列索引
df.loc[:,[‘A’,‘C’]]或者df.iloc[:,0:2]:用于从A到C的列切片索引,左右都包含。
行列索引
df.iloc[0:2,0:2]或者df.loc[‘a’:‘b’,‘A’:‘B’]:用于实现行列组合索引切片。
3.过滤索引
df[df.A>0]:使用单个列的值来选择数据。
df[df>0]:从满足布尔条件的DataFrame中选择值。
【数据筛选】
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
使用“与”进行筛选
df_inner.loc[(df_inner[‘age’] > 25) & (df_inner[‘city’] == ‘xiamen’), [‘id’,’city’,’age’,’gender’]]
使用“或”进行筛选
df_inner.loc[(df_inner[‘age’] > 25) | (df_inner[‘city’] == ‘xiamen’), [‘id’,’city’,’age’,’gender’]])
使用“非”条件进行筛选
df_inner.loc[(df_inner[‘city’] != ‘xiamen’), [‘id’,’city’,’age’,’gender’]].sort([‘id’])
对筛选后的数据按city列进行计数
df_inner.loc[(df_inner[‘city’] != ‘xiamen’), [‘id’,’city’,’age’,’gender’]].sort([‘id’]).city.count()
使用query函数进行筛选
df_inner.query(‘city == [“beijing”, “xiamen”]’)
对筛选后的结果按price进行求和
df_inner.query(‘city == [“beijing”, “xiamen”]’).price.sum()
【数据合并】
merge: 两个数据合并,how有inner、left、right、outer
pd.merge(df,df1,how=inner)
append:两个数据连接,df2存放在df1后面
df1.append(df2)
join:数据合并,根据on指定的内容合并。
df1.join(df2,on=’key’)
concat:可以将数据根据不同的轴合并
pd.concat([df1,df2,df3],axis=1) # 将df1,df2,df3按列进行合并。
【数据汇总】
主要有groupby和pivote_table
df_inner.groupby(‘city’).count():对所有的列进行计数汇总
df_inner.groupby(‘city’)[‘id’].count():按城市对id字段进行计数
df_inner.groupby([‘city’,’size’])[‘id’].count():对两个字段进行汇总计数
df_inner.groupby(‘city’)[‘price’].agg([len,np.sum, np.mean]):对city字段汇总,分别计算price的总和和均值
【loc、iloc、ix三者区别】
loc:标签索引,可以用字符串,eg:df.loc[‘A’]返回行标签为’A’的数据,df.loc[2]返回行标签为2的数据
iloc:位置索引,只能用数字,根据索引数进行索引,eg:df.iloc[2]返回位置索引为2,即第三行的数据。
ix:标签索引和位置索引,可以用字符串也可以用数字,已弃用该功能。