NumPy、Pandas、Scipy是python的三个库,也是数据分析的常用库。其中,numpy学习强烈推荐NumPy中文文档。Pandas是基于NumPy的一种工具,数据操作更加方便,这里总结了Pandas的一些教程,更多内容查看官方文档说明。
安装包
pip install pandas
载入包
import pandas as pd
创建数组
pandas常用数据结构中,一维Series,二维DataFrame,三维Panel。
Series 数据结构与list相似,但只允许存储相同的数据类型,同时,Series可以自定义索引,索引默认从0开始递增。
pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
pd.Series(["小兰","女",24,"Beijing"],list("abcd"))
输出:
a 小兰
b 女
c 24
d Beijing
dtype: object
DataFrame 可看做Series组成的字典,通常定义DataFrame可用dict定义,类似于excel和myslq的表格。
pd.DataFrame(data = None, index = None, columns = None, dtype = None, copy = False )
#举例
dict = {"name": ["小兰","小民","小红"],
"sex":["女","男","女"],
"age":[24,20,21],
"city":["Beijing","Beijing","Tianjin"]}
df = pd.DataFrame(dict)
输出:
name | sex | age | city | |
---|---|---|---|---|
a | 小兰 | 女 | 24 | Beijing |
b | 小民 | 男 | 20 | Beijing |
c | 小红 | 女 | 21 | Tianjin |
DataFrame还可以通过info直接查看数据类型和统计,dtypes查看数据类型,shape查看形状,describe汇总统计。
df.info()
df.dtypes
df.shape
df.describe()
info()输出如下,可以查看数据类型和数量,空值数量
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns (total 4 columns):
name 3 non-null object
sex 3 non-null object
age 3 non-null int64
city 3 non-null object
dtypes: int64(1), object(3)
memory usage: 120.0+ bytes
describe()输出如下:
增删行列
增加列,和字典操作一样,可以通过直接在后面插入列的方式,另外还可以使用insert函数
insert(loc, column, value, allow_duplicates=False)
df[新增列名] = [内容] #增加列,默认插入到最后一列
#举例
data = [1,1,2]
df.insert(0,"class",data) #loc为指定位置,这里为0,则插入开头
class | name | sex | age | city | |
---|---|---|---|---|---|
a | 1 | 小兰 | 女 | 24 | Beijing |
b | 1 | 小民 | 男 | 20 | Beijing |
c | 2 | 小红 | 女 | 21 | Tianjin |
增加行
pd.DataFrame.append(other, ignore_index=False,
verify_integrity=False, sort=None)
#举例
dict_1 = {"class":[2,2],
"name": ["小新","小花"],
"sex":["男","女"],
"age":[19,22],
"city":["Shanghai","Tianjin"]}
df_1 = pd.DataFrame(dict_1,list("ab"))
df_2 = df.append(df_1,ignore_index=True) #ignore_index为是否重新排序,True重新排序,False则为原本序号
class | name | sex | age | city | |
---|---|---|---|---|---|
0 | 1 | 小兰 | 女 | 24 | Beijing |
1 | 1 | 小民 | 男 | 20 | Beijing |
2 | 2 | 小红 | 女 | 21 | Tianjin |
3 | 2 | 小新 | 男 | 19 | Shanghai |
4 | 2 | 小花 | 女 | 22 | Tianjin |
删除行列
删除列,可使用pop()以及del直接删除,删除行列则可以使用drop(),建议使用drop()而不是del,因为drop()不改变原数据,而是重新生成新的数据,同样的还有append()。
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')#axis = 0表示行,1表示列,默认为0
df.pop("age") #删除并返回age列
del df["age"] #直接删除age列
#举例
df_2.drop(index=[1,2],columns= "city") #表示删除1,2行以及city列
df_2.drop("city",axis=1) #删除city列
df_2.drop([1,2]) #删除1、2行
修改索引
如果需要修改数组的索引,可以使用rename()
rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)
#举例
df_2.rename({0:"a",1:"b",2:"c",3:"d",4:"e"}) #直接修改,默认修改index
df_2.index=["a","b","c","d","e"] #使用index或columns直接修改会改变原数据,rename()则不改变原数据
df_2.rename(str.upper,axis="columns") #将列名改为大写,axis默认为"index"
df_2.rename(index= lambda x: x+2) #修改行序号为
df_2.rename(columns={"age":"年龄"}) #修改age列为“年龄”
修改值,可以直接通过
索引和切片
通过索引方式直接选取列,可以使用方括号[ ],也可以直接引用列名。
df_2["age"]
df_2[["age","city"]] #选取多列
df_2.age
行的选取可以通过iloc,loc以及ix,loc是location(位置),iloc的i是integer(整数),从名字就可以看出两者的区别。
df.iloc[1]
df.loc["b"]
两者输出均为一样
class 1
name 小民
sex 男
age 20
city Beijing
Name: b, dtype: object
pandas同样能够进行切片操作,还可以利用iloc方便进行切片操作,可以参考numpy切片
df.iloc[1:3] #等同于df[1:3],df.loc[["b","c"]]
df_2.iloc[1:3]
df_2.loc[1:3] #当行索引为默认数字时可使用loc,注意loc[1:3]为闭区间,取1,2,3行,区别df_2.iloc[1:3]
通过切片可以方便地批量修改特定位置值,如:
df_2[:4,3]=18
df_2.iloc[1]["age"] =20
可以试试下面的输出的结果
df_2.iloc[:2,:3]
df_2.iloc[2,3]
df_2.iloc[::2,::3]
df_2.iloc[::-1]
算术运算
和numpy一样,pandas也能对数组进行运算
add(other, axis='columns', level=None, fill_value=None)
类似add()的还有sub(),mul(),div()......分别为加减乘除。
sum(axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)
类似sum()的还有max(),min()
a = pd.DataFrame(np.arange(9).reshape(3,3))
b = pd.DataFrame(np.arange(16).reshape(4,4))
#输入代码查看结果
a+b #a.add(b)
a.div(b)
a.add(b, fill_value = 0)
a.add([5,5,6], axis="index")
a.sum()
a.sum(axis=1)
a.max()
查找缺失值
数据常常需要先处理缺失值,再进行数据分析,这里用到fillna()或者replace()替换缺失值,dropna()去除缺失值。
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
c = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
c.fillna(1) #替换空值为1
c.replace(np.nan,1) #同上
c.dropna(axis=1,how = "all") #删除所有值为空值的列,how="any"为任意值为空值,
c.dropna(thresh = 2) #每行只有有2个非空值才保留
c.dropna(subset=["D","A"]) #删除保留A、D列有空值的行
数组连接
数据的合并、连接需要用到merge、join、concat函数,官方文档:
merge类似于sql的左右内外连接,通过列键连接;
join通过行索引连接,以及将键转为索引连接;后续会写具体使用方法,这里就不详细说明。
merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
how:连接方式, {‘left’, ‘right’, ‘outer’, ‘inner’},默认inner
on, right_on, left_on :对应的分别为连接键、右连接键、左连接键
sort:对连接键进行排序
join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False, copy=True)
df_3 = pd.DataFrame({"name":["小兰","小民","小民","小红","小红","小红","小新"],
"course":["math","manth","physics","math","physics","English","math"],
"score":[80,90,89,98,76,85,92]})
df_2.merge(df_3,on="name")
输出:
数组汇总
groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
df_3.groupby(["name"]).mean() #计算每人的平均分
数据透视
pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
pivt_table可以参考excel的数据透视表,values为透视的值,index为透视行,columns为透视列,aggfunc为值计算函数,fill_value对nan值的填充
pd.pivot_table(df_3,values = "score", index="name",columns="course",fill_value=0)
增加计算列
需要去列进行新增计算列时,可以用assign函数
assign(**kwargs)
**kwargs为可调用的列
#所有学生分数按80%计算
df_3.assign(score80 = lambda x: x.score*0.8)
df_3.assign(score80 = df_3["score"]*0.8)
以上输出一样:
assign函数还能直接对新生成的列计算
df_3.assign(score80 = lambda x: x.score*0.8,score50 = lambda x: x["score80"]*0.5)
以上就是pandas的一些总结教程,后续介绍pandas在时间日期的应用,pandas在日期时间处理上十分方便。