数据分析工具Pandas

Pandas简介

什么是Pandas

Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

一个强大的分析和操作大型结构化数据集所需的工具集
基础是NumPy,提供了高性能矩阵的运算
提供了大量能够快速便捷地处理数据的函数和方法
应用于数据挖掘,数据分析
提供数据清洗功能
官网:http://pandas.pydata.org

导入pandas
import pandas as pd
pd别名业界约定


Pandas的数据结构

Series

Series是一种类似于一维数组的对象,组成:
一组数据(各种NumPy数据类型)
一组与之对应的索引(数据标签)
索引(index)在左,数据(values)在右
索引是自动创建的

1.通过list构建series

ser_obj = pd.series(range(10,30))#不指定索引的话,默认从0开始
print(ser_obj)
print(ser_obj.head(3))
print(type(ser_obj))

image.png

2.通过dict构建series

dict = {"Java":80,"php":85,"python":90}
ser_obj = pd.Series(dict)
print(ser_obj)

image.png

3.获取数据和索引
ser_obj.inde 和 ser_obj.values

#获取数据
print(ser_obj.values)
#获取索引
print(ser_obj.index)

image.png

4.通过索引获取数据
ser_obj[idx]

#通过索引获取数据
print(ser_obj1[0])
print(ser_obj1[3])

image.png

5.设置名称
对象名:ser_obj.name 给整个表起名字
对象索引名:ser_obj.index.name给某一列

ser_obj1.name = 'score'
ser_obj1.index.name = 'subject'
image.png

DataFrame

一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,数据是以二维结构存放的。
类似多维数组/表格数据 (如,excel, R中的data.frame)
每列数据可以是不同的类型
索引包括列索引和行索引

1.通过ndarray构建DataFrame

arr_obj = np.random.rand(3,4)
df_obj = pd.DataFrame(arr_obj)
print(df_obj)
print(df_obj.head(2)) #看前两行
image.png

2.通过dict构建DataFrame

dict2 = { "A":1,
         "B":pd.Timestamp("20180124"),
         "C":pd.Series(range(10,14),dtype="float64"),
         "D":['Java','Python','C++',"php"],
         "E":np.array([3]*4)    
}
df_obj2 = pd.DataFrame(dict2)
print(df_obj2)

image.png

3.通过索引获取列数据

print(df_obj2['D'])
print(type(df_obj2['D']))
print(type(df_obj2['C']))
print(type(df_obj2['A']))
print(df_obj2.A)

image.png

4.增加列数据

df_obj2['F'] = {"金水区":80,"二七区":75,"中原区":72,"高新区":88}
print(df_obj2)

image.png

列数据增加

df_obj2["H"] = df_obj["C"]+10

image.png

5.删除列

del(df_obj2['E'])
print(df_obj2)
image.png

Pandas的索引操作

索引对象Index

Series和Frame中的索引都是Index对象
索引对象不可变,保证了数据的安全
1.index指定行索引名
不指定索引的话,默认从0开始

ser_obj3 = pd.Series([1,2,3,6,7,8],index=['a','b','c','d','e','f'])
print(ser_obj3)

image.png

2.行索引

print(ser_obj3['c'])
print(ser_obj3[3])

image.png

3.切片索引
注意,按索引名切片操作时,是包含终止索引的。

print(ser_obj3['b':'e'])
print(ser_obj3[1:4])

image.png

4.不连续索引

print(ser_obj3[['b','e','f']])
image.png

5.布尔索引

bool_arr = ser_obj3 > 3
print(bool_arr)
image.png

DataFrame索引

1.columns指定列索引名

df_obj5 = pd.DataFrame(np.random.randn(5,4),index = ['A','B','C','D','E'],columns=['a','b','c','d']) 
print(df_obj5)

image.png

2.列索引

print(df_obj5['b'])
image.png
print(df_obj5['b']['D'])
image.png

3.不连续索引

print(df_obj5[['a','c']])
image.png

高级索引:标签、位置和混合

1.loc标签索引
loc是基于标签名的索引,也就是我们自定义的索引名

print(df_obj5['b'])
print(df_obj5[['b','d']])  # 不连续
print(df_obj5.loc['A':'D','b':'d']) # 切片
image.png
print(ser_obj3['a'])
print(ser_obj3.loc['a'])
print(ser_obj3.loc[['a','b']])  # 不连续
print(ser_obj3.loc['b':'d'])  # 切片

image.png
print(df_obj5['a']['A'])
print(df_obj5[df_obj5['a']!=df_obj5['a'][2]])

image.png

2.iloc位置索引
作用与loc一样,不过是给予索引编号来索引

print(ser_obj3.iloc[1:3])
image.png
print(df_obj5.iloc[0:2,1:4])

image.png

3.ix标签与位置混合索引
ix是以上二者的综合,既可以使用索引编号,又可以使用自定义索引,要视情况不同来使用
如果索引既有数字又有英文,容易导致定位的混乱,那么这种方式不建议使用的

# Series 对象
print(ser_obj3.ix[0:3])
print(ser_obj3.ix['b':'e'])
#print(ser_obj3.ix['b':4])
image.png
# DataFrame对象
print(df_obj5)
print(df_obj5.ix[1:3,1:3])
print(df_obj5.ix[1:3,'b':'d'])
image.png

Pandas的对齐运算

是数据清洗的重要过程,可以按索引对齐进行运算,如果没对齐的位置则补NaN

Series的对齐运算

1.Series 按行、索引对齐

ser_obj5 = pd.Series(range(10,20),index=range(10))
ser_obj6 = pd.Series(range(15,20),index=range(5))
print(ser_obj5)
print(ser_obj6)
image.png
ser_obj5 + ser_obj6
image.png
print(ser_obj5.add(ser_obj6))
image.png
print(ser_obj5.add(ser_obj6,fill_value=0))
image.png

DataFrame的对齐运算

DataFrame做对齐运算时,未对齐数据可以通过fill_value来指定数据做对齐运算
add,sub,mul,div,加减乘除

df_obj6 = pd.DataFrame(np.ones((2,2)),columns=['a','b'])
print(df_obj6)
df_obj7=pd.DataFrame(np.ones((5,4)),columns=['a','b','c','d'])
print(df_obj7)
image.png
df_obj6 + df_obj7
image.png
df_obj6.add(df_obj7,fill_value=0)
image.png
df_obj6.add(df_obj7,fill_value=1)
image.png
df_obj8 = pd.DataFrame(np.random.randn(5,4)-1)
print(df_obj8)
image.png

Pandas的函数应用

1.可以直接使用numpy的函数
在numpy里,可以对数组里的每一个元素进行操作的函数称为ufunc 通用函数(universal function)
在Pandas里可以直接使用Numpy的ufunc

print(df_obj8.abs())

image.png

2.通过apply将函数应用到列或行上

f = lambda x:x.max()
print(df_obj8.apply(f))

image.png

3.通过applymap将函数应用到每个数据上,只用于DataFrame

# 取DataFrame对象中每一个浮点数小数点后两位
print(df_obj8.applymap(lambda x:"%.2f"%x))
image.png

ps:
DataFrame对象可以用apply()和applymap()
apply()应用于行,列,可以通过axis来指定
Series对象只能用apply ,效果等于Pyton的map()
ser_obj.map(func)
ser_obj.apply(func)

4.排序

分为按索引排序和按值排序
4.1索引排序
sort_index()
排序默认为升序排序,asscending=False为降序排序

# Series 
ser_obj8 = pd.Series(range(10,15),index=np.random.randint(5,size=5))
print(ser_obj8)
image.png
sorted_obj = ser_obj8.sort_index()
print(sorted_obj)
print(type(sorted_obj))
image.png
print(ser_obj8.sort_index(ascending=False))
image.png

对DataFrame操作时注意轴方向,默认列,axis = 1 为行

df_obj9 = pd.DataFrame(np.random.randn(3,5),index=np.random.randint(3,size=3),columns=np.random.randint(5,size=5))
print(df_obj9)
image.png
# 默认情况下 ,按行索引排序,升序
print(df_obj9.sort_index())
image.png
print(df_obj9.sort_index(axis=1,ascending=False))

image.png

4.2按值排序
sort_values(by='column name')
根据某个唯一的列名进行排序,如果有其他相同列名则报错
series 对象的按值排序

# series 对象的按值排序
ser_obj9 = pd.Series(np.random.randint(10,20,size=10))
print(ser_obj9)
image.png
# 默认 升序
print(ser_obj9.sort_values())
image.png
# ascending = false 降序
print(ser_obj9.sort_values(ascending=False))

image.png

Dataframe对象按值排序

df_obj10 = pd.DataFrame(np.random.randn(3,5),index=np.random.randint(3,size=3),columns=np.random.randint(5,size=5))
print(df_obj10)
image.png
# 默认的按列排序
print(df_obj10.sort_values(by=0))
image.png
print(df_obj10.sort_values(by=1,axis=1,ascending=False))

image.png

4.3处理缺失数据

df_obj11 = pd.DataFrame(
    [[1,2,3,np.nan],
    [4,5,np.nan,6],
    [7,8,9,np.nan],
    list(range(4))]
)
print(df_obj11)
image.png
print(df_obj11.isnull())

image.png

丢弃

print(df_obj11.dropna())
print(df_obj11.dropna(axis=1))
image.png

填充

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

推荐阅读更多精彩内容