pandas学习笔记
这一块主要用于记录自己利用这段空闲时间,进一步提高自己使用pandas工具的能力,对一些模糊问题进行重新学习及强化。
numpy:处理数值型数据
pandas:还可以处理字符串、时间序列
一、概念问题
二、细节问题
1、pandas的常用数据类型
(1)Series:一维,带标签数组
(2)DataFrame:二维,Series容器
2、Series的用法
1)使用Series创建数组的几种方法
import pandas as pd
# 第一种
a=pd.Series([1,2,3,4,5],index=list('abcde'))
# 第二种
temp_dict={1:'a',2:'b',3:'c',4:'d',5:'e'}
a=pd.Series(temp_dict)
2)更改数组类型
a=pd.Series([1,2,3,4,5])
a.astype('float64')
3)Series切片和索引
tem_dict={'age':30,'name':'xiaohong','tel':10086}
a=pd.Series(tem_dict)
b=a['age'] # 取某个单一的元素
b=a['tel']
b=a[0]
b=a[1]
b=a[[1,2]] # 取两个元素
b=a[['age','tel']]
a=pd.Series(np.arange(10))
b=a[a>4] # 布尔索引
Series的索引和值
tem_dict={'age':30,'name':'xiaohong','tel':10086}
a=pd.Series(tem_dict)
print(a.index,type(a.index)) # 类型为Index
print(a.values,type(a.values)) # 类型为numpy.ndarry
Series对象本质上由两个数组组成,一个数组构成对象的键(index,索引),一个数组构成对象的值(values),键 ——>值。
2、DataFrame的用法
df=pd.DataFrame(np.arange(10).reshape((2,5)))
df=pd.DataFrame(np.arange(10).reshape((2,5)),index=list('ab'),columns=list('WXYZU))
DataFrame对象既有行索引,又有列索引。
行索引:表明不同行,横向索引,叫index,0轴,axis=0
列索引:表明不同列,纵向索引,叫columns,1轴,axis=1
1)DataFrame的基础属性
df.shape # 行数 列数
df.dtypes # 列数据类型
df.ndim # 数据维度
df.index # 行索引
df.columns # 列索引
df.values # 对象值,二维ndarray数组
2)DataFrame的整体情况查询
df.head(3) # 显示头部几行,默认5行
df.tail(3) # 显示末尾几行,默认5行
df.info() # 相关信息概览:行数、列数、列索引、列非空值个数、列类型、内存占用
df.describe() # 快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值
三、新内容新知识
1、pandas读取文件中的数据
df=pd.read_csv(path)
df=pd.read_excel(path)
df=pd.read_table(path)
df=pd.read_sql(sql_sentence,connection)
df=pd.read_html()
df=pd.read_json()
df=pd.read_pickle(path)
2、DataFrame
DataFrame中排序的方法
df=pd.read_csv(path)
df=df.sort_values(by='姓名',ascending=True) # 按照姓名那一列进行排序
DataFrame取某一行或者某一列
a=df[:100] # 取前100行
a=df['姓名'] # 取“姓名”那一列
a=df[:100]['姓名'] # 同时选择行和列
3、pandas中loc和iloc
df.loc:通过标签索引行数据
df.iloc:通过位置获取行数据
df=pd.DataFrame(np.arange(10).reshape((2,5)),index=list('ab'),columns=list('VWXYZ'))
a=df.loc['a','X'] # 取某一个元素
a=df.loc['a'] # 取某一行
a=df.loc[:,'X'] # 取某一列
a=df.loc[['a','b'],['X','Z','W']] # 取某几行几列
a=df.iloc[0,0] # 取某一个元素
a=df.iloc[0] # 取某一行
a=df.iloc[:,0] # 取某一列
a=df.iloc[[0,1],[1,2,4]] # 取某几行几列
a=df[df[:,'X']>3] # 布尔索引
4、缺失数据的处理方法
判断数据是否为nan:pd.isnull(df)
、pd.notnull(df)
处理方式1(直接删除):删除nan所在的行和列df.dropna(axis=0,how='any',inplace=False)
处理方式2(填充数据): df.fillna(df.mean())
处理为0 的数据:df[df==0]=np.nan
当然并不是每次为0的数据都需要处理,计算平均值等情况,nan是不会参与计算的,但是0会。
5、数据合并
join:默认情况下,将行索引相同的数据合并到一起
a=pd.DataFrame(np.arange(10).reshape((2,5)),index=list('AB'),columns=list('abcde'))
b=pd.DataFrame(np.arange(12).reshape((3,4)),index=list('ABC'),columns=list('1234'))
'''
a为:
a b c d e
A 0 1 2 3 4
B 5 6 7 8 9
******************
b为:
1 2 3 4
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
'''
c=a.join(b)
'''
c为:
a b c d e 1 2 3 4
A 0 1 2 3 4 0 1 2 3
B 5 6 7 8 9 4 5 6 7
'''
c=b.join(a)
'''
c为:
1 2 3 4 a b c d e
A 0 1 2 3 0.0 1.0 2.0 3.0 4.0
B 4 5 6 7 5.0 6.0 7.0 8.0 9.0
C 8 9 10 11 NaN NaN NaN NaN NaN
'''
merge:按照指定的列把数据按照一定的方式合并到一起。
a=pd.DataFrame(np.arange(10).reshape((2,5)),index=list('AB'),columns=list('abcde'))
b=pd.DataFrame(np.arange(12).reshape((3,4)),index=list('ABC'),columns=list('almn'))
'''
a为:
a b c d e
A 0 1 2 3 4
B 5 6 7 8 9
*********************
b为:
a l m n
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
'''
1)默认的合并方式为inner,求交集
c=a.merge(b,on='a')
'''
c为:
a b c d e l m n
0 0 1 2 3 4 1 2 3
'''
c=b.merge(a,on='a')
'''
a l m n b c d e
0 0 1 2 3 1 2 3 4
'''
2)merge 合并方式为outer时,求并集,nan补全
c=a.merge(b,on='a',how='outer')
'''
c为:
a b c d e l m n
0 0 1.0 2.0 3.0 4.0 1.0 2.0 3.0
1 5 6.0 7.0 8.0 9.0 NaN NaN NaN
2 4 NaN NaN NaN NaN 5.0 6.0 7.0
3 8 NaN NaN NaN NaN 9.0 10.0 11.0
'''
c=b.merge(a,on='a',how='outer')
'''
c为:
a l m n b c d e
0 0 1.0 2.0 3.0 1.0 2.0 3.0 4.0
1 4 5.0 6.0 7.0 NaN NaN NaN NaN
2 8 9.0 10.0 11.0 NaN NaN NaN NaN
3 5 NaN NaN NaN 6.0 7.0 8.0 9.0
'''
3)merge合并方式为left时,以左边为准,nan补全
c=b.merge(a,on='a',how='left')
'''
c为:
a l m n b c d e
0 0 1 2 3 1.0 2.0 3.0 4.0
1 4 5 6 7 NaN NaN NaN NaN
2 8 9 10 11 NaN NaN NaN NaN
'''
4)merge合并方式为right时,以右边为准,nan补全
c=b.merge(a,on='a',how='right')
'''
c为:
a l m n b c d e
0 0 1.0 2.0 3.0 1 2 3 4
1 5 NaN NaN NaN 6 7 8 9
'''
6、分组和聚合
1)pandas中的分组操作使用df.groupby(by=columns_name)
来完成。
grouped=df.groupby(by='columns_name)
groupes是一个DataFrameBy对象,是可迭代的
groupes中的每一个元素是一个元组。元组里面是(索引(分组的值),分组之后的DataFrame)
DataFrameBy对象有很多经过优化的方法:
函数名 说明
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的算术中位数
std、var 无偏(分母为n-1)标准差和方差
min、max 非NA值的最小值和最大值