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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容