Pandas是一个强大的工具集,用于分析结构化的数据。Pandas的基础是 NumPy。Pandas常用于数据挖掘、数据分析和数据清洗。
Pandas相当于Python中的Excel,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。
import pandas as pd
1. Series
Series 就像数据库中的属性和对应的一行,类似于一维数组,可以保存任何数据类型。轴标签(属性)统称为索引。
1.1 创建Series
1.1.1 通过list创建
pd.series(list, index=[]) index默认为0,1,2,3...,下同
lst = [1,2,3,4]
s = pd.Series(lst, index=['a', 'b', 'c', 'd'])
1.1.2 通过字典创建
pd.series(dict)
dic = {"A":1,"B":2,"C":3,"D":2}
s2 = pd.Series(dic)
1.1.3 通过NumPy创建
pd.Series(np)
s = pd.Series(np.random.randint(1,10,size=(3,)),index=['a','b','c'])
1.2. Series的索引和切片
1.2.1 隐式索引
s[0] 取第0个元素
s[[0,1]] 取列表中索引的多行
s[start:end] 切片操作,取到start至end-1行
使用iloc来专门对隐式索引进行相关操作,也是只能取到0和1行,顾头不顾尾
s.iloc[start:end] 跟s[start:end] 一样
s.iloc[[0,1]] 跟s[[0,1]]一样
1.2.2 显式索引
""引号内是索引
s["e1"] 取单个元素
s[["e1","e2"]] 取可以连续也可以不连续的多行
s["e1":"e2"] 切片,取e1行和e2行,这里的e2行可以取到
使用loc来专门对显式索引进行相关操作
s.loc["e1":"e2"] 跟s["e1":"e2"]一样
s.loc[["e1","e1"]] 跟s[["e1","e1"]]一样
1.3 显示
s1.head(a) 显示前a行 不带参数默认为5行
s1.tail(a) 显示后a行 不带参数默认为5行
2. DataFrame
DataFrame类似于一张表格,包含有一组有序的列,每列可以是不同的数值类型,可以被看做是由Series组成的字典。
行索引index,表明不同行,横向索引,axis=0,每一行代表一条数据记录
列索引columns,表明不同列,纵向索引,axis=1,每一列代表一个属性
2.1 创建DataFrame
2.1.1 通过字典创建
pd.DataFrame(data)
data = {
'name':['n1','n2','n3'],
'height':[170,184,179,167,180]
}
frame = pd.DataFrame(data)
2.1.2 通过csv文件创建
pd.read_csv("xxx.csv")
2.2 DataFrame的属性
df.shape 行、列数
df.dtypes 列数据类型
df.ndim 数据维度
df.index 取行索引
df.columns 取列索引
df.values 取df的值,二维np.ndarray数组
2.3 DataFrame索引
方括号中写数组,表示取行;写字符串,表示取列
frame['列名','列名'...] 根据列名进行显式索引
frame[start: end] 隐式索引取行
frame[行索引][列索引] 同时取行和列
frame[frame['属性']>5] 布尔索引
frame.iloc[] 通过标签进行索引(行)
frame.loc[] 通过位置进行索引(列)
2.4 DataFrame常用方法
df.dropna(axis=0) 删除包含NaN的行 参数how="all"全为NaN才删除
df.fillna(xx 将NaN替换为xx)
2.5 缺失数据处理
df.sort_values(by="xx") 根据xx属性升序排列,加ascending=False参数则降序排列
pd.isnull(df) 返回是否为NaN
df.mean() 平均数
df.median() 中位数
2.6 案例:电影数据分析
下表是IMDb网站上的部分数据
链接:https://pan.baidu.com/s/12KBnRmcYg6hOQJmYazQMwA
提取码:x7wh
输出所有电影的平均分,输出导演的人数、输出演员的人数
import pandas as pd
movie_df = pd.read_csv("datasets_IMDB-Movie-Data.csv")
movie_df.head(20)
print(movie_df["Rating"].mean())
print(movie_df["Director"].unique().__len__())
# str Series转为String
actor_list_of_each_movie = movie_df["Actors"].str.split(',').tolist()
actor_list = list(set([actor for l in actor_list_of_each_movie for actor in l]))
print(actor_list.__len__())
输出每个分类的电影的数量
import numpy as np
import pandas as pd
movie_df = pd.read_csv("datasets_IMDB-Movie-Data.csv")
genre_col = movie_df["Genre"]
all_genres = genre_col.str.split(',').tolist()
genre_list = list(set([i for j in all_genres for i in j]))
zeros_df = pd.DataFrame(np.zeros((movie_df.shape[0], len(genre_list))), columns=genre_list)
for i in range(movie_df.shape[0]):
zeros_df.loc[i, all_genres[i]] = 1
genre_count = zeros_df.sum(axis=0)
print(genre_count)