Pandas入门

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在日期时间处理上十分方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容