pandas

pandas

一、什么是pandas?

Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。

Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了 高级数据结构数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

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

二、pandas的常用数据类型之Series

Pandas有两个最主要也是最重要的数据结构: SeriesDataFrame

Series 一维,带标签数组

Series是一种类似于一维数组的 对象,由一组数据(各种NumPy数据类型)以及一组与之对应的索引(数据标签)组成。

  • 类似一维数组的对象
  • 由数据和索引组成
    • 索引(index)在左,数据(values)在右
    • 索引是自动创建的

1.pandas之Series创建

import pandas as pd

法一:通过list构建Series

pd.Series([0,1,2,3,4,5],index=list(“abcdef”))

法二(字典):通过dict构建Series

temp_dict = {“0”:“a”,“1”:“b”,“2”:“c”}

t = pd.Series(temp_dict)

2.Series切片、索引、值

切片:直接传入start end 或步长即可

索引:一个的时候直接传入序号或者index,多个的时候传入序号或者index的列表

如:t[2:10:2]、t[1]、t[[2,3,6]]、t[t>4]、t[“A”,“F”,“G”]

Series对象本质上由两个数组构成,一个数组构成对象的键(index,索引),一个数组构成对象的值(Values)

索引:t.index

值:t.values

3.pandas之读取外部数据

pd.read_csv()

三、pandas的常用数据类型之DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,它可以被看做是由Series组成的字典(共用同一个索引),数据是以二维结构存放的。

  • 类似多维数组/表格数据 (如,excel, R中的data.frame)

  • 每列数据可以是不同的类型

  • DataFrame对象既有行索引,又有列索引。

    行索引,表明不同行,横向索引,叫index,0轴,axis=0

    列索引,表明不同列,纵向索引,叫columns,1轴,axis=1

1.DataFrame的创建

法一:通过ndarray构建DataFrame

t = pd.DataFrame(np.arange(12).reshape(3,4),index=list(“ ”),columns=list(“ ”))

法二:通过dict构建DataFrame

t = {“name”:[“xiaoming”,“xiaogang”],“age”:[20,32],“tel”:[10086,10010]}

t = pd.DataFrame(t)

法三:通过dict构建DataFrame

t = [{“name”:“xiaohong”,“age”:32,“tel”:10010},{"name:“xiaogang”,“tel”:10020},{"name:“xiaohuang”,"age:"18}]

t = pd.DataFrame(t)

如果字典中有的键不存在,该位置为nan

2.DataFrame的描述信息

df.shape # 行数 列数

df.dtypes # 列数据类型

df.ndim # 数据维度

df.index # 行索引

df.columns # 列索引

df.values # 对象值,二维ndarray数组

df.head(3) # 显示头部几行,默认5行

df.tail(3) # 显示末尾几行,默认5行

df.info() # 相关信息概览:行数/列数/列索引/列非空值个数

df.describe() # 快速综合统计结果:计数、均值、标准差、最大值、最小值

df.sort_values(by=“列名”,ascending=False) # 按照某列进行排序

3.pandas之取行或者列

方括号写数字,表示取行,对行进行操作

写字符串,表示取列索引,对列进行操作

同时取行取列>==同时写数字和字符串

4.pandas之loc、iloc

df.loc 通过标签索引行数据

在这里插入图片描述

df.iloc 通过位置获取行数据

在这里插入图片描述

5.pandas之布尔索引

单个条件:df[df[“a”]>100]

多个条件:df[()|()] 或 df[()&()]

四.缺失数据的处理

1)判断数据是否为NaN:pd.isnull(df)/pd.notnull(df)

2)处理方式1:删除NaN所在的行列dropna (axis=0, how=‘any’, inplace=False)

​ 处理方式2:填充数据

​ t.fillna(t.mean()),

​ t.fiallna(t.median())

​ t.fillna(0)

处理为0的数据:t[t==0]=np.nan

当然并不是每次为0的数据都需要处理计算平均值等情况,nan是不参与计算的,但是0会

五.pandas常用统计方法

sum, mean, max, min…

axis=0 按列统计,axis=1按行统计

假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data

import pandas as pd
df = pd.read_csv("IMDB-Movie-Data.csv")
# 获取平均分
print(df["Rating"].mean())
# 获取导演人数
print(len(set(df["Director"].to_list())))
print(len(df["Director"].unique()))
# 获取演员的人数
temp_actors_list = df["Actors"].str.split(",").to_list()  # 此时temp_actors_list为[[],[],[]......]
actors_list = [i for j in temp_actors_list for i in j]
# actors_list = []
# for j in temp_actors_list:
#     for i in j:
#         actors_list.append(i)
actors_list = set(actors_list)
nums = len(set(actors_list))
print(nums)

六.字符串离散化

对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?

思路:重新构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让0变为1

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
file_path = "IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)
# 统计分类的列表
temp_list = df["Genre"].str.split(",").to_list() #[[],[],[],[].....]
#genre_list = list(set([i for j in temp_list for i in j]))
genre_list = []
for j in temp_list:
    for i in j:
        genre_list.append(i)
genre_list = set(genre_list)
# 构造全为0的数组
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
# 给每个电影出现分类的位置赋值为1
for i in range(df.shape[0]):
    zeros_df.loc[i,temp_list[i]] = 1
# 统计每个分类的电影的数量和
genre_count = zeros_df.sum(axis=0)
# 排序
genre_count = genre_count.sort_values()
_x = genre_count.index
_y = genre_count.values
# 画图
plt.figure(figsize=(12,6),dpi=100)
plt.bar(_x,_y)
plt.xticks(range(len(_x)),_x)
plt.show()

七.数据合并之join

join:默认情况下把行索引相同的数据合并到一起

若df1.join(df2),以df1为准,反之以df2为准。

八.数据合并之merge

merge:按照指定的列把数据按照一定的方式合并到一起

内连接(交集):t1.merge(t2,on=“a”,how=“inner”)

外连接(并集):t1.merge(t2,on=“a”,how=“outter”)

左连接(以t1为准):t1.merge(t2,on=“a”,how=“left”)

右连接(以t2为准):t1.merge(t2,on=“a”,how=“right”)

九.pandas的分组和聚合

grouped = df.groupby(by=“columns_name”)

grouped是一个DataFrameGroupBy对象,是可迭代的

grouped中的每一个元素是一个元组,元组里面是(索引(分组的值),分组之后的DataFrame)

案例:现在我们有一组关于全球星巴克店铺的统计数据,如果我想知道美国的星巴克数量和中国的哪个多应该怎么办?

数据来源:https://www.kaggle.com/starbucks/store-locations/data

import pandas as pd

file_path = "starbucks_store_worldwide.csv"
df = pd.read_csv(file_path)
grouped = df.groupby(by="Country")

country_count = grouped["Brand"].count()
print(country_count["US"])
print(country_count["CN"])

按照多个条件进行分组:grouped = df.groupby(by=[df[“Country”],df[“State/Province”]])

十.索引和复合索引

简单的索引操作:

获取index:df.index

设置index :df.index = [‘x’,‘y’]

重新设置index : df.reindex(list(“abcedf”))

指定某一列作为index :df.set_index(“a”,drop=False)

返回index的唯一值:df.set_index(“Country”).index.unique()

df.swaplevel():交换里外层索引的位置

从复合索引中取值:

Series:s1[“a”,“b”]

DataFrame:df.loc[“a”].loc[“b”]

十一.pandas时间序列

pd.date_range(start=None, end=None, periods=None, freq=‘D’)

start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引

start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引

十二.pandas重采样

重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样

pandas提供了一个resample的方法来帮助我们实现频率转化

PeriodIndex

把分开的时间字符串通过periodIndex的方法转化为pandas的时间类型

periods = pd.PeriodIndex(year=data[“year”],month=data[“month”],day=data[“day”],hour=data[“hour”],freq=“H”)

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页