目录
一.数据结构series创建
二、数据表信息查看
三、数据表清洗
四、数据预处理
五、数据提取
六、数据筛选
七、数据汇总
八、数据统计
九、数据输出
pd.Series(data=None,index=None,dtype=None,name=None,copy=False) data:输入的数据,可以是列表,常量,ndarray数组等 index:索引值,必须是可散列的(不可变数据类型(str,bytes和数值类型)),并且与数据具有 dtype:输出系列的数据类型,如果未指定,将从数据中推断 name:为Series定义一个名称 copy:表示对data拷贝,默认为False,仅影响Series和ndarray import pandas as pd ar = [3,5,6,8,1,3] sl = pd.Series(ar) print(sl) --> 0 3 1 5 2 6 3 8 4 1 5 3 dtype: int64 #通过index和values取得对应的值 sl.index sl.values print(sl.index,sl.values) sl[1]取得索引为1的值 sl[1]=30改变对应的索引值 #不能通过负值,从后向前找值 #通过不存在的索引找值,会报错,但也会加新值 #新增不同类型索引的数据,索引的类型也会变化 sl['a']='ad' sl-->dtype='object' #如果标签非整形,既可以用标签取值,也可以用标签下标取值
2、导入CSV或者xlsx文件:
df = pd.DataFrame(pd.read_csv('name.csv',header=1))
df = pd.DataFrame(pd.read_excel('name.xlsx'))
import pandas as pd from collections import namedtuple Item = namedtuple('Item', 'reply pv') items = [] with codecs.open('reply.pv.07', 'r', 'utf-8') as f: for line in f: line_split = line.strip().split('\t') items.append(Item(line_split[0].strip(), line_split[1].strip())) df = pd.DataFrame.from_records(items, columns=['reply', 'pv'])
3、用pandas创建数据表:
df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006], "date":pd.date_range('20130102', periods=6), "city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '], "age":[23,44,54,32,34,32], "category":['100-A','100-B','110-A','110-C','210-A','130-F'], "price":[1200,np.nan,2133,5433,np.nan,4432]}, columns =['id','date','city','category','age','price'])
1、维度查看:
df.shape
2、数据表基本信息(维度、列名称、数据格式、所占空间等):
df.info()
3、每一列数据的格式:
df.dtypes
4、某一列格式:
df['B'].dtype
5、空值:
df.isnull()
6、查看某一列空值:
df['B'].isnull()
7、查看某一列的唯一值:
df['B'].unique()
8、查看数据表的值:
df.values
9、查看列名称:
df.columns #使用df['列']=值,插入新数据 df.insert(loc,column,value,allow_duplicates=False) loc:整型,插入索引,必须验证0<=loc<=len column:插入列的标签,类型可为(字符串/数字/散列对象) value:数值,Series或者数组 allow_duplicates:允许重复,可以有相同的列标签数据,默认为False info=[['王杰',18],['李杰',20],['张杰',21]] df = pd.DataFrame(info,columns=['name','age']) print(df) --> name age 0 王杰 18 1 李杰 20 2 张杰 21 df.insert(2,column='score',value=[91,90,75]) print(df) --> name age score 0 王杰 18 91 1 李杰 20 90 2 张杰 21 75
10、查看前5行数据、后5行数据:
df.head() #默认前5行数据 df.tail() #默认后5行数据
11.append追加数据 #在新版本中即将取消
df.append(other,ignore_index=False,verify_integrity=False,sort=False) other:DataFrame或Series/dict类对象,或这些对象的列表 ignore_index:若为True将不适用index标签 verify_integrity:若为True,则创建具有重复项的索引时引发valueError sort:排序 #添加时需指定行标签,或忽略index d2 = {'name':'dd','age':13} 1.df3 = df.append(d2,ignore_index=True)#忽略index 2.s = pd.Series(d2,name='a')#设定行 df3 = df.append(s) print(df3) #添加列表,list是二维的,则以行的形式追加 #如果list为一维的,以列的形式追加 #如果list是三维的,只添加一个值 a_1 = [[10,20,30]] df4 = df.append(a_1) --> one two three 0 1 2 a 1.0 1.0 1.0 NaN NaN NaN b 2.0 3.0 3.0 NaN NaN NaN c 3.0 4.0 5.0 NaN NaN NaN d NaN 6.0 7.0 NaN NaN NaN e NaN NaN 9.0 NaN NaN NaN 0 NaN NaN NaN 10.0 20.0 30.0 df5 = df.append(a_1,ignore_index=True) ---> one two three 0 1 2 0 1.0 1.0 1.0 NaN NaN NaN 1 2.0 3.0 3.0 NaN NaN NaN 2 3.0 4.0 5.0 NaN NaN NaN 3 NaN 6.0 7.0 NaN NaN NaN 4 NaN NaN 9.0 NaN NaN NaN 5 NaN NaN NaN 10.0 20.0 30.0
12.删除缺失值
df.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False) axis 0为行 1为列,default 0,数据删除维度 how {‘any’, ‘all’}默认为any, any:删除带有nan的行;all:删除全为nan的行 thresh int,保留至少 int 个非nan行 subset list,在特定列缺失值处理 inplace bool,是否修改源文件 >>>df name toy born 0 Alfred NaN NaT 1 Batman Batmobile 1940-04-25 2 Catwoman Bullwhip NaT >>>df.dropna()#删除至少缺少一个元素的行: name toy born 1 Batman Batmobile 1940-04-25 #删除至少缺少一个元素的列: >>>df.dropna(axis=1) name 0 Alfred 1 Batman 2 Catwoman #删除所有元素丢失的行: >>>df.dropna(how='all') name toy born 0 Alfred NaN NaT 1 Batman Batmobile 1940-04-25 2 Catwoman Bullwhip NaT #只保留至少2个非NA值的行: >>>df.dropna(thresh=2) name toy born 1 Batman Batmobile 1940-04-25 2 Catwoman Bullwhip NaT #修改原数据: >>>df.dropna(inplace=True) >>>df name toy born 1 Batman Batmobile 1940-04-25
1.fillna函数:
作用:补充缺失值
fillna(value,inplace,method,limit,axis) 指定参数的情况下进行缺失值填充 1、inplace参数的取值:True、False True:直接修改原对象 Fasle:创建一个副本,修改副本,原对象不变(缺失默认) 2、method参数的取值:{'pad','ffill','backfill','bfill','None'} pad/ffill:用前一个非缺失值去填充该缺失值 backfill/bfill:用下一个非缺失值填充该缺失值 None:指定一个值去替换缺失值(缺失默认) 3.limit参数:限制填充个数 4.axis参数:修改填充方向 5.value:填充值 6.downcast:
1、用数字0填充空值:
df.fillna(value=0)
2、使用列prince的均值对NA进行填充:
df['prince'].fillna(df['prince'].mean())
3、清除city字段的字符空格:
df['city']=df['city'].map(str.strip)
4、大小写转换:
df['city']=df['city'].str.lower()
5、更改数据格式:
df['price'].astype('int')
6、更改列名称:
df.rename(columns={'category': 'category-size'})
7、删除后出现的重复值:
drop_duplicates(self, subset: None, keep: 'first', inplace: False, ignore_index:False) subset : 指定重复数据所在的列。 keep : {'first', 'last', False}, first: 除了第一次出现以外,删除重复项。 last: 除了第一次出现以外,删除重复项。 False : 删除所有重复项。 inplace : True:直接在原始数据删除, False:不直接在原始数据删除,并生成一个副本。 ignore_index : True/False,False重新定义索引从0开始
df['city'].drop_duplicates()
8 、删除先出现的重复值:
df['city'].drop_duplicates(keep='last')
9、数据替换:
df['city'].replace('sh', 'shanghai')
10.删除数据:
del和pop pop会返回删除的值 d = {'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['a','b','c','d'])} df = pd.DataFrame(d) del df['one'] print(df) --> two a 1 b 2 c 3 d 4 res_pop = df.pop('two') print(res_pop) --> a 1 b 2 c 3 d 4 Name: two, dtype: int64 drop('行标签') DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) labels 就是要删除的行列的名字,用列表给定,标签找不到会报错 axis 默认为0,指删除行,因此删除columns时要指定axis=1; index 直接指定要删除的行 columns 直接指定要删除的列 inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe; inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。 因此,删除行列有两种方式: 1)labels=None,axis=0 的组合 2)index或columns直接指定要删除的行或列 df = df.drop(0)#1.源数据=修改后的数据 df = df.drop(1)#2.添加inplace=True
11.DataFrame各类用法
#1.转置:df.T,把行和列进行交换源数据未变化 #2.df.axes:返回一个行标签,列标签组成的列表 #3.df.dtypes:返回Series,每一列的数据类型 #4.df.empty:判断df是否为空 if not df.empty:#判断是否为真 print('....') #5.df.columns:返回DataFrame所有列标签 df.columns.size #6.df.shape返回一个元祖,获取列数和行数,表示DataFrame维度 #7.df.values以数组形式返回数据 #8.df.head获取前面数列,默认前5行 #9.df.tail获取后面数列,默认后5行 #10.df.rename(index=None,columns=None,inplace=False) index:修改后的行标签名 columns:修改后的列标签名 inplace:默认为False,不改变源数据,返回修改后的值 True改变源数据 #11.df.info打印DataFrame的简要摘要,显示DataFrame的信息,包括索引数据类型dtype和列的数据类型,非空值的数量和内存使用情况 #12.df.sort_index(axis=0,ascending=True,inplace=False) 默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序 df.sort_index()和df.sort_values()完全相同,但Python推荐在对根据行标签对所有行排序,或根据列标签对所有列排序时用第一种; 其他时候用df.sort_values() axis:0按照行名排序;1按照列名排序,默认为0 ascending:默认True升序排列;False降序排列 inplace:默认False,否则排序之后的数据直接替换原来的数据 df.sort_values(by,axis=0,ascending=True,inplace=False, kind='quicksort',na_position='last') #注意指定by参数,即必须指定那几行或那几列 by:如果axis=0,by='列名';如果axis=1,by='行名' axis:默认为0 ascending:同上 inplace:同上 na_position:默认缺少值排在最后('first','last') df = pd.DataFrame({'b':[1,2,3,2],'a':[4,5,2,7],'c':[1,6,3,8]},index=[2,0,1,3]) --> b a c 2 1 4 1 0 2 5 6 1 3 2 3 3 2 7 8 #先按b列降序,再按a列升序排序 df.sort_values(by=['b','a'],ascending=[False,True]) --> b a c 1 3 2 3 0 2 5 6 3 2 7 8 2 1 4 1 #按行3升序排列 df.sort_values(by=3,axis=1)#必须指定axis=1 b a c 2 1 4 1 0 2 5 6 1 3 2 3 3 2 7 8 s = df.sort_values(by='b',axis=0)#把b列排序 --> b a c 2 1 4 1 0 2 5 6 3 2 7 8 1 3 2 3 #先按行3升序,行0降序 df.sort_values(by=['3','0'],axis=1,ascending=[True,False])
DataFrame 特点:1.每一列标签值允许使用不同的数据类型 2.是表格型的数据结构,具有行和列 3.中间的每个数据都可以被修改 4.有两个方向的标签轴,分别是行标签和列标签 5.对行和列执行算术运算 DataFrame(data=None,index=None,columns=None,dtype=None,copy=None) 总结: 列表出发:表示一行一行数据 1.列表嵌套列表:[['你今年','34'],['你今年','23']] #使用默认的列表标签 2.列表嵌套字典:[{'a':1,'b':2},{'a':1,'b':2,'c':3}] #使用字典的key作为数据 字典出发:表示一列一列数据 1.字典对应值是列表:{'name':['a','b','c'],'age':[12,14,16]} #行使用默认标签 2.字典对应值是Series {'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['a','b','c','d'])} #行和列都是设置的标签,并且还可以指定列的数据类型 #列不可以切片
df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008], "gender":['male','female','male','female','male','female','male','female'], "pay":['Y','N','Y','Y','N','Y','N','Y',], "m-point":[10,12,20,40,40,40,30,20]}) ----> id gender pay m-point 0 1001 male Y 10 1 1002 female N 12 2 1003 male Y 20 3 1004 female Y 40 4 1005 male N 40 5 1006 female Y 40 6 1007 male N 30 7 1008 female Y 20
1、数据表合并
1.1 merge
df_inner=pd.merge(df,df1,how='inner') # 匹配合并,交集 df_left=pd.merge(df,df1,how='left') # df_right=pd.merge(df,df1,how='right') df_outer=pd.merge(df,df1,how='outer') #并集
1.2 append
result = df1.append(df2)
1.3 join
result = left.join(right, on='key')
1.4 concat
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True) objs︰ 一个序列或系列、 综合或面板对象的映射。如果字典中传递,将作为键参数,使用排序的键,除非它传递,在这种情况下的值将会选择 (见下文)。任何没有任何反对将默默地被丢弃,除非他们都没有在这种情况下将引发 ValueError。 axis: {0,1,…},默认值为 0。要连接沿轴。 join: {‘内部’、 ‘外’},默认 ‘外’。如何处理其他 axis(es) 上的索引。联盟内、 外的交叉口。 ignore_index︰ 布尔值、 默认 False。如果为 True,则不要串联轴上使用的索引值。由此产生的轴将标记 0,…,n-1。这是有用的如果你串联串联轴没有有意义的索引信息的对象。请注意在联接中仍然受到尊重的其他轴上的索引值。 join_axes︰ 索引对象的列表。具体的指标,用于其他 n-1 轴而不是执行内部/外部设置逻辑。 keys︰ 序列,默认为无。构建分层索引使用通过的键作为最外面的级别。如果多个级别获得通过,应包含元组。 levels︰ 列表的序列,默认为无。具体水平 (唯一值) 用于构建多重。否则,他们将推断钥匙。 names︰ 列表中,默认为无。由此产生的分层索引中的级的名称。 verify_integrity︰ 布尔值、 默认 False。检查是否新的串联的轴包含重复项。这可以是相对于实际数据串联非常昂贵。 副本︰ 布尔值、 默认 True。如果为 False,请不要,不必要地复制数据。
例子:1.frames = [df1, df2, df3] 2.result = pd.concat(frames)
2、设置索引列
df_inner.set_index('id')
3、按照特定列的值排序:
df_inner.sort_values(by=['age'])
4、按照索引列排序:
df_inner.sort_index()
5、如果prince列的值>3000,group列显示high,否则显示low:
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
6、对复合多个条件的数据进行分组标记
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
7、对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size'])
8、将完成分裂后的数据表和原df_inner数据表进行匹配
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)
主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。
1、按索引提取单行的数值
df_inner.loc[3]
2、按索引提取区域行数值
df_inner.iloc[0:5]#0行4行
3、重设索引
df_inner.reset_index()
4、设置日期为索引
df_inner=df_inner.set_index('date')
5、提取4日之前的所有数据
df_inner[:'2013-01-04']
6、使用iloc按位置区域提取数据
df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。
7、适应iloc按位置单独提起数据
df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
8、使用ix按索引标签和位置混合提取数据
df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据
9、判断city列的值是否为北京
df_inner['city'].isin(['beijing'])
10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来
df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])]
11、提取前三个字符,并生成数据表
pd.DataFrame(df_inner['category'].str[:3])
12.行列切片
#标签为b的行到标签为d的行,对应标签为one的列 df.loc['b':'d','one'] df.loc['b':'d','one':'three'] #标签为b的行和标签为d的行,对应标签为one的列到标签为two的列 df.loc[['b','d'],['one','two']]
使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
1、使用“与”进行筛选
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
2、使用“或”进行筛选
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age'])
3、使用“非”条件进行筛选
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id'])
4、对筛选后的数据按city列进行计数
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
5、使用query函数进行筛选
df_inner.query('city == ["beijing", "shanghai"]')
6、对筛选后的结果按prince进行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
主要函数是groupby和pivote_table
1、对所有的列进行计数汇总
df_inner.groupby('city').count()
2、按城市对id字段进行计数
df_inner.groupby('city')['id'].count()
3、对两个字段进行汇总计数
df_inner.groupby(['city','size'])['id'].count()
4、对city字段进行汇总,并分别计算prince的合计和均值
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])
数据采样,计算标准差,协方差和相关系数
1、简单的数据采样
df_inner.sample(n=3)
2、手动设置采样权重
weights = [0, 0, 0, 0, 0.5, 0.5] df_inner.sample(n=2, weights=weights)
3、采样后不放回
df_inner.sample(n=6, replace=False)
4、采样后放回
df_inner.sample(n=6, replace=True)
5、 数据表描述性统计
df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
6、计算列的标准差
df_inner['price'].std()
7、计算两个字段间的协方差
df_inner['price'].cov(df_inner['m-point'])
8、数据表中所有字段间的协方差
df_inner.cov()
9、两个字段的相关性分析
df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
10、数据表的相关性分析
df_inner.corr()
分析后的数据可以输出为xlsx格式和csv格式
1、写入Excel
df_inner.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc')
2、写入到CSV
df_inner.to_csv('excel_to_python.csv')
3.读取文件
read_csv() read_excel() read_json() read_sql_query() 常用参数 read_csv(url/r'文件名') dtype(str/int)#设置每列类型 converters#读取数据时对列数据进行交换,例如converters={'id':lambda x:int(x)+10} true_values/false_values=['..']#那些值该被替换为true/false #只有某一列值全部出现在true_values+false_values里面,才会被替换 skiprows:表示过滤行,先过滤在确定表头 skiprows=[0,3] skiprows=lambda x:x>0 and x%2==0#去除x>0且能整除2的数 skipfooter:从文件末尾过滤行,使用时要设置引擎,和编码 skipfooter=1,engine='python',encoding='utf-8' na_values:将参数设置为空 parse_dates:指定某些列为时间类型,一般搭配date_parser date_parser:有的列虽然是日期,但没办法直接转化,需要指定一个解析格式 parse_dates=['birthday'] date_parser=lambda x:datetime.strptime(x,'%Y年%m月%d日') iterator:迭代器,布尔类型,默认为False。如果为True,那么返回一个TextFileReader对象,以便逐块处理文件。在文件很大时使用 import os os.getcwd()#获取当前文件路径
4.设置头部信息
#不指定names,指定header为1,则选取第二行当作表头,第二行下面作为数据 pd.read_csv(r'...',header=1) #只设置names,原来的names会成为数据 pd.read_csv(r'...',names=['....']) #都设置就可以 pd.read_csv(r'...',header = 0,names=['....']) csv文件有表头且为第一行,那么names和header都无需指定 csv有表头但不是第一行,指定header就可以 换表头同时指定 没有表头,手动生成
5.index_col
pd.read_csv(r'...',index_col='') index_col的值有三种,整数型,序列,布尔,并且是可选的,默认是None 如果您的文件格式不正确,每行末尾都有分隔符,则可以考虑使用index_col=false强制pandas不使用第一列作为索引(行名)。 1.index_col 默认值(index_col = None)——重新设置一列成为index值 2.index_col=False——重新设置一列成为index值 3.index_col=0——第一列为index值
所有参数 pandas.read_csv(filepath_or_buffer, sep=NoDefault.no_default, delimiter=None, header='infer', names=NoDefault.no_default, index_col=None, usecols=None, squeeze=None, prefix=NoDefault.no_default, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=None, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal='.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors='strict', dialect=None, error_bad_lines=None, warn_bad_lines=None, on_bad_lines=None, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)