pandas库的学习(个人用)
为什么要学习pandas?
numpy能够帮我们处理处理数值型数据,但是这还不够
很多时候,我们的数据除了数值之外,还有**字符串,还有时间序列**等
所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据
pandas的常用数据类型
Series 一维,带标签数组(带索引)
创建Series数组
-
方法一: 列表型
pd.Series([1,5,8,67,9],index = list('abcde'))
输出结果为:
a 1
b 5
c 8
d 67
e 9
dtype: int64前为index,后为value
index是人为添加数据的索引,用list类型
-
方法二: 字典型
import pandas as pd temp_dict = {'name':'xiaohong','age':30,'tel':10086} t = pd.Series(temp_dict) print(t)
输出结果为:
name xiaohong
age 30
tel 10086
dtype: object-
创建字典:
import string a = {string.ascii_uppercase[i]:i for i in range(5)} print(a)
输出结果为:
{‘A’: 0, ‘B’: 1, ‘C’: 2, ‘D’: 3, ‘E’: 4}
i 最大为26(字母只有26个)
同理,ascii_lowercase为小写字母
重新给其指定其他的索引之后,如果能够对应上,就取其值,如果不能,就为Nan.示例如下:
import string import pandas as pd a = {string.ascii_uppercase[i]:i for i in range(10)} print(a) b = pd.Series(a,index=list(string.ascii_uppercase[5:15])) print(b)
b的输出结果为:
F 5.0
G 6.0
H 7.0
I 8.0
J 9.0
K NaN
L NaN
M NaN
N NaN
O NaN
dtype: float64 -
Series列表的detype修改:
a.astype(float)
即同numpy的修改方法
Series列表的索引:
-
方法一:类似字典,输入a[索引]
如果输入不存在的索引,得到的value为 NaN
-
方法二:下标索引,a[1]
索引多行与普通索引方式相同
pandas读取外部数据(读出来的结果是DataFrame)
当文件为csv时:
df = pd.read_csv("数据地址")
此外,pd.read_
后面可以加很多类型的文件,可以根据需求选择
DataFrame 二维,Series容器
DataFrame的创建
-
pd.DataFrame(np.arange(12).reshape((3,4)))
输出结果为:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11竖的和横的都是索引,DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
行索引和列索引也可以如Series一样认为指定
将字典传入DataFrame(注意,DataFrame也可以传入列表)
import pandas as pd
d1 = {"name":["xiaoming",
"xiaogang"],"age":[20,32],"tel":[10086,10010]}
d1 = pd.DataFrame(d1)
print(d1)
输出结果为:
name age tel
0 xiaoming 20 10086
1 xiaogang 32 10010
一行即为一条数据
DataFrame整体情况查询(不得不感叹功能强大)
df.head(3) # 显示头部几行,默认5行
df.tail(3) # 显示未尾几行,默认5行
df.info() # 相关信息概览: 行数,列数,列索引,列非空值个数,列类型,列类型,内存占用
df.describe() #快速综合统计结果: 计数,均值,标准差,最大值,四分位数,最小值
DataFrame中排序的方法
df = df.sort_value(by = '',ascending = True)
by表示按照什么排序,ascending表示升序还是降序,默认为True,降序
DataFrame取行取列操作(即切片)
方括号写数字,表示取行,对行进行操作
写字符串,表示取列,对列进行操作
pd.loc[]
:表示通过标签索引行数据
pd.iloc[]
表示通过位置获取行数据
DataFrame布尔类型的索引
df[]
方括号内写条件,一次只能写一条,如果有多个条件,则需要用&或者|连接两个条件,不同的条件之间需要用括号括起来,(df[]&df[])
&表示且,|表示或
字符串处理:
数据汇总描述
describe()函数和include()函数
语法:df.decribe(include = [""])
describe() 函数输出了平均值、std 和 IQR 值(四分位距)等一系列统计信息。通过 describe() 提供的include
能够筛选字符列或者数字列的摘要信息。
include 相关参数值说明如下:
- object: 表示对字符列进行统计信息描述;
- number:表示对数字列进行统计信息描述;
- all:汇总所有列的统计信息。
感觉all的情况可以直接不传include()
pandas使用自定义函数
1) 操作整个 DataFrame 的函数:pipe()
示例如下:
import pandas as pd
import numpy as np
#自定义函数
def adder(ele1,ele2):
return ele1+ele2
#操作DataFrame
df = pd.DataFrame(np.random.randn(4,3),columns=['c1','c2','c3'])
#相加前
print(df)
#相加后
print(df.pipe(adder,3))
输出结果为:
c1 c2 c3
0 1.989075 0.932426 -0.523568
1 -1.736317 0.703575 -0.819940
2 0.657279 -0.872929 0.040841
3 0.441424 1.170723 -0.629618
c1 c2 c3
0 4.989075 3.932426 2.476432
1 1.263683 3.703575 2.180060
2 3.657279 2.127071 3.040841
3 3.441424 4.170723 2.370382
2) 操作行或者列的函数:apply()
语法:
df.apply(,axis = )
axis传入要操作的是行还是列,不传入时默认为列
3) 操作单一元素的函数:applymap()
DataFrame 数据表结构的 applymap() 和 Series 系列结构的 map() 类似,它们都可以接受一个 Python 函数,并返回相应的值。
语法:
df[].map(lambda x:x*100)
或df.applymap(lambda x:x*10)
这两个需结合map和lambda去理解
pandas缺失数据的处理
数据缺失有两种情况,一种是空,None,即nan,另一种是本来就是零
将一个数据变成nan的方法:a = np.nan
判断数据是否是nan
pd.isnull()
括号内传入数据,为nan的地方全是True
pd.notnull()
得到的结果与上面相反
处理方法1:删除
df.dropna(axis,how,inplace)
axis指定索引的是行还是列
how传入两种参数—‘any’:表示只要含有nan的就整行或整列的删除;‘all’'表示只有一整行或者一整列都是nan的情况下才删除
inplace表示是否进行原地修改,默认为False,即不进行原地修改
处理方法2:填充数据
df.fillna()
传入一个数字,即可以将nan变成那个数字,一般传入均值,即df.fillna(df.mean())
计算平均值等情况,nan是不参与计算的,但是0会
统计方法和字符串离散化:
统计人数的方法:
print(len(df['Director'].unique()))
unique会将重复数据删掉,并返回一个列表
或者
print(set(len(df["Director"].tolist()))
也能得到相同的结果
遍历嵌套列表的方法
a = [i for j in list for i in j]
字符串离散化用来统计
如果要统计某一个字符串出现了几次,可以创建一个全是零的数组,出现一次该字符串就将零变成一,之后再进行求和操作
数据合并
join(行)
join默认情况是将行索引相同的合并在一起
如果合并的两组数据行数不一样,df1.join(df2)
则以df1为准.
即: df1行数更多时,df2缺少的那些行为NaN
df1行数更少时,df2多出的那些行不添加进去
merge(列)
merge:按照指定的列把数据按照一定的方式合并到一起
默认的合并方式: inner 交集
merge outer :并集, NaN补全
merge left :左边为准, NaN补全
merge right: 右边为准, NaN补全
语法:
df1.merge(df2,on = '',how = '')
on: 传入列索引的具体索引来合并
- 如果没有相同的列索引,则可以用
left_on = ''
和right_on = ''
进行一一对应
how: 传入合并方式
有点抽象,给张图片辅助理解下
数据的分组
创建groupby分组对象
groupby可以沿任意轴分组,分组时可以按指定的键(key)作为每组的组名,方法如下:
- df.groupby(“key”)
- df.groupby(“key”,axis=1)
- df.groupby([“key1”,“key2”])
查看分组结果
1)groups查看分组结果
语法:
df.groupby('key').groups
key指示按照什么来进行分组
示例:
import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
'score': [82, 98, 91, 87],
'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
print(df.groupby('score').groups)
输出结果为:
{82: Int64Index([0], dtype='int64'),
87: Int64Index([3], dtype='int64'),
91: Int64Index([2], dtype='int64'),
98: Int64Index([1], dtype='int64')}
2)多个列标签分组
简单概括就是groupby传入一个[‘key1’,‘key2’]
输出结果类似如下示例:
{('Ella', 87): Int64Index([3], dtype='int64'),
('Helen', 98): Int64Index([1], dtype='int64'),
('John', 82): Int64Index([0], dtype='int64'),
('Sona', 91): Int64Index([2], dtype='int64')}
通过get_group()方法选择组内具体数据项
import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
'score': [82, 98, 91, 87],
'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#根据score来分组
grouped=df.groupby('score')
#根据对应组的数据值,选择一个组
print(grouped.get_group(91))
输出结果为:
Name score option_course
2 Sona 91 Java
用什么key来进行分组,就只能用该key内的具体数据项来索引
遍历分组数据
用for循环即可遍历
groupby分组后每一个元素都是元组类型,元组内第一个元素是组的名称,第二个元素是df数据
因此,可以用如下的方法遍历分组数据
import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
'score': [82, 98, 91, 87],
'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
grouped=df.groupby('score')
for label, option_course in grouped:
#其中key代表分组后字典的键,也就是score
print(label)
#字典对应的值选修的科目
print(option_course)
输出结果;
82
Name score option_course
0 John 82 C#
87
Name score option_course
3 Ella 87 C
91
Name score option_course
2 Sona 91 Java
98
Name score option_course
1 Helen 98 Python
索引和复合索引
简单的索引操作:
•获取index:df.index
•指定index :df.index = [‘x’,‘y’]
•重新设置index : df.reindex(list(“abcedf”))
•指定某一列作为index :df.set_index(“Country”,drop=False)
默认drop为True,即去取出索引的数据之后,将源数据删除
•返回index的唯一值:df.set_index(“Country”).index.unique()
C#
87
Name score option_course
3 Ella 87 C
91
Name score option_course
2 Sona 91 Java
98
Name score option_course
1 Helen 98 Python
## 索引和复合索引
简单的索引操作:
•获取index:df.index
•指定index :df.index = ['x','y']
•重新设置index : df.reindex(list("abcedf"))
•指定某一列作为index :df.set_index("Country",drop=False)
默认drop为True,即去取出索引的数据之后,将源数据删除
•返回index的唯一值:df.set_index("Country").index.unique()