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))
2.通过dict构建series
dict = {"Java":80,"php":85,"python":90}
ser_obj = pd.Series(dict)
print(ser_obj)
3.获取数据和索引
ser_obj.inde 和 ser_obj.values
#获取数据
print(ser_obj.values)
#获取索引
print(ser_obj.index)
4.通过索引获取数据
ser_obj[idx]
#通过索引获取数据
print(ser_obj1[0])
print(ser_obj1[3])
5.设置名称
对象名:ser_obj.name 给整个表起名字
对象索引名:ser_obj.index.name给某一列
ser_obj1.name = 'score'
ser_obj1.index.name = 'subject'
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)) #看前两行
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)
3.通过索引获取列数据
print(df_obj2['D'])
print(type(df_obj2['D']))
print(type(df_obj2['C']))
print(type(df_obj2['A']))
print(df_obj2.A)
4.增加列数据
df_obj2['F'] = {"金水区":80,"二七区":75,"中原区":72,"高新区":88}
print(df_obj2)
列数据增加
df_obj2["H"] = df_obj["C"]+10
5.删除列
del(df_obj2['E'])
print(df_obj2)
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)
2.行索引
print(ser_obj3['c'])
print(ser_obj3[3])
3.切片索引
注意,按索引名切片操作时,是包含终止索引的。
print(ser_obj3['b':'e'])
print(ser_obj3[1:4])
4.不连续索引
print(ser_obj3[['b','e','f']])
5.布尔索引
bool_arr = ser_obj3 > 3
print(bool_arr)
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)
2.列索引
print(df_obj5['b'])
print(df_obj5['b']['D'])
3.不连续索引
print(df_obj5[['a','c']])
高级索引:标签、位置和混合
1.loc标签索引
loc是基于标签名的索引,也就是我们自定义的索引名
print(df_obj5['b'])
print(df_obj5[['b','d']]) # 不连续
print(df_obj5.loc['A':'D','b':'d']) # 切片
print(ser_obj3['a'])
print(ser_obj3.loc['a'])
print(ser_obj3.loc[['a','b']]) # 不连续
print(ser_obj3.loc['b':'d']) # 切片
print(df_obj5['a']['A'])
print(df_obj5[df_obj5['a']!=df_obj5['a'][2]])
2.iloc位置索引
作用与loc一样,不过是给予索引编号来索引
print(ser_obj3.iloc[1:3])
print(df_obj5.iloc[0:2,1:4])
3.ix标签与位置混合索引
ix是以上二者的综合,既可以使用索引编号,又可以使用自定义索引,要视情况不同来使用
如果索引既有数字又有英文,容易导致定位的混乱,那么这种方式不建议使用的
# Series 对象
print(ser_obj3.ix[0:3])
print(ser_obj3.ix['b':'e'])
#print(ser_obj3.ix['b':4])
# DataFrame对象
print(df_obj5)
print(df_obj5.ix[1:3,1:3])
print(df_obj5.ix[1:3,'b':'d'])
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)
ser_obj5 + ser_obj6
print(ser_obj5.add(ser_obj6))
print(ser_obj5.add(ser_obj6,fill_value=0))
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)
df_obj6 + df_obj7
df_obj6.add(df_obj7,fill_value=0)
df_obj6.add(df_obj7,fill_value=1)
df_obj8 = pd.DataFrame(np.random.randn(5,4)-1)
print(df_obj8)
Pandas的函数应用
1.可以直接使用numpy的函数
在numpy里,可以对数组里的每一个元素进行操作的函数称为ufunc 通用函数(universal function)
在Pandas里可以直接使用Numpy的ufunc
print(df_obj8.abs())
2.通过apply将函数应用到列或行上
f = lambda x:x.max()
print(df_obj8.apply(f))
3.通过applymap将函数应用到每个数据上,只用于DataFrame
# 取DataFrame对象中每一个浮点数小数点后两位
print(df_obj8.applymap(lambda x:"%.2f"%x))
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)
sorted_obj = ser_obj8.sort_index()
print(sorted_obj)
print(type(sorted_obj))
print(ser_obj8.sort_index(ascending=False))
对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)
# 默认情况下 ,按行索引排序,升序
print(df_obj9.sort_index())
print(df_obj9.sort_index(axis=1,ascending=False))
4.2按值排序
sort_values(by='column name')
根据某个唯一的列名进行排序,如果有其他相同列名则报错
series 对象的按值排序
# series 对象的按值排序
ser_obj9 = pd.Series(np.random.randint(10,20,size=10))
print(ser_obj9)
# 默认 升序
print(ser_obj9.sort_values())
# ascending = false 降序
print(ser_obj9.sort_values(ascending=False))
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)
# 默认的按列排序
print(df_obj10.sort_values(by=0))
print(df_obj10.sort_values(by=1,axis=1,ascending=False))
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)
print(df_obj11.isnull())
丢弃
print(df_obj11.dropna())
print(df_obj11.dropna(axis=1))
填充
print(df_obj11.fillna(3.14))