pandas模块

1 Series

1.1 新建

'''列表创建'''
s = pd.Series([1,2,3,4],index = list('ABCD'))
s.astype('int32') #改变数据结构
----------------------------------
import string
'''字典创建'''
a = {string.ascii_uppercase[i]:i for i in range(10)}
b = pd.Series(a)
pd.Series(a,index = list(string.ascii_uppercase[5:16])) #重新索引

1.2 切片和索引

'''通过位置'''
t[0:2:1]
b[b>4]
----------------------------
'''通过index'''
b['A']
b['A':'C']
b[['A','B','F']] #若‘f'不存在,则报错
----------------------------
'''获得index'''
t.index
type(t.index)---->pandas.core.indexes.base.Index
----------------------------
'''获得value'''
t.values
type(t.values)---->numpy.ndarray

2 DataFrame

2.1 新建

pd.DataFrame(np.arange(12).reshape((3,4)),
			index = list(string.ascii_uppercase[:3]),
			columns = list(string.ascii_uppercase[-4:]))

在这里插入图片描述

2.2 快速了解pandas

在这里插入图片描述
排序函数:

'''依据第二、三列,数值降序排序'''
df.sort_values(by=['col2','col3'],ascending=False)

2.3 取行和取列

col2列中大于5的所有数据df[df['col2']>5]
选择某一列:df[" Count_AnimalName "]
选择前100行:df[:100]
同时选择行和列:t[:3]['Y'] t[行][列]

2.4 索引

DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

1、df.loc 通过标签索引行数据
在这里插入图片描述
需要注意的是:冒号在loc里是闭合的
2、df.iloc 通过位置获取行数据
冒号在iloc里不闭合的
在这里插入图片描述
3、赋值更改数据
在这里插入图片描述
4、布尔索引
在这里插入图片描述
多条件:
想找到所有的使用次数超过700并且名字的字符串的长度大于4的狗的名字

df[(df['Row_Labels'].str.len() > 4) & (df['Count_AnimalName'] > 700)]

tips:
1:
&表示且
|表示或
2:
不同条件之间需要用括号括起来
3:
在使用pandas的时候,经常要对DataFrame的某一列进行操作,一般都会使用df[“xx”].str下的方法.既然是df[“xx”].str,那么xx这一列必须是字符串类型,当然在pandas里面是object,不能是整形、时间类型等等。如果想对这些类型使用的话,必须先df[“xx”].astype(str)转化一下,才能使用此方法。
常见方法:
在这里插入图片描述

2.5 缺失数据处理

在这里插入图片描述
我们的数据缺失通常有两种情况:
一种就是空,None等,在pandas是NaN(和np.nan一样)
另一种是我们让其为0的,见蓝色框
处理方式:

1、判断数据是否为NaN:
pd.isnull(df)
在这里插入图片描述
pd.notnull(df)
在这里插入图片描述
处理方式1:删除NaN所在的行列
dropna (axis=0, how='any', inplace=False)
处理方式2:填充数据

t.fillna(t.mean())  NaN所在列的平均值
t.fiallna(t.median())
t.fillna(0)`

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

3 pandas常用统计方法

df['A'].max() 列的最大值
df['A'].argmax() 列的最大值下标
df['A'].min() 列的最小值
df['A'].argmin() 列的最小值下标
df['A'].median() 列的中值
df['A'].mean() 列的平均值

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

df = pd.read_csv(r"C:\Users\24291\数据分析资料\day04\code\IMDB-Movie-Data.csv")

#电影平均得分
print(df["Rating"].mean())

#导演人数
print(len(df["Director"].unique()))

#演员人数
temp_actors_list = df["Actors"].str.split(", ").tolist()
actors_list = [i for j in temp_actors_list for i in j]
actors_num = len(set(actors_list))
print(actors_num)

4 字符离散化

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

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

在这里插入图片描述

#获取字符串去重后的列表
temp_list = df['Genre'].str.split(',').to_list() #[[..],[...]]
genre_list = list(set([v for i in temp_list for v in i]))

#构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让0变为1
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns = genre_list)
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=(20,8),dpi=80)
plt.bar(range(len(_x)),_y,width=0.4,color="orange")
plt.xticks(range(len(_x)),_x)
plt.show()

5 join和merge

5.1 join

行索引相同的数据合并到一起
在这里插入图片描述

5.2 merge

按照指定的列把数据按照一定的方式合并到一起
在这里插入图片描述
其中,left_on和right_on可以指定左表是on哪个字段,右表on哪个字段,当on的字段名不同时使用。

6 分组和聚合

grouped = df.groupby(by="columns_name")

grouped是一个DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组
元组里面是(索引(分组的值),分组之后的DataFrame)

df = pd.read_csv(r"C:\Users\24291\数据分析资料\day05\code\starbucks_store_worldwide.csv")
#各个国家的咖啡店数量
grouped = df.groupby(by="Country")
country_count = grouped['Brand'].count()
country_count
#中国每个省份星巴克的数量
china_data = df[df['Country']== 'CN']
china_data.groupby(by=['Country','State/Province']).count()['Brand']

#数据按照多个条件进行分组,返回DataFrame,得到复合索引
grouped3 = df.groupby(by=[df["Country"],df["State/Province"]]).count()[["Brand"]]
grouped4 = df.groupby(by =['Country','State/Province']).count()[['Brand']] # ['Brand']得到Series,[['Brand']]得到DataFrame
grouped4

在这里插入图片描述
聚合函数:
在这里插入图片描述
如果我们需要对国家和省份进行分组统计,应该怎么操作呢?

grouped = df.groupby(by=[df[“Country”],df[“State/Province”]])

很多时候我们只希望对获取分组之后的某一部分数据,或者说我们只希望对某几列数据进行分组,这个时候我们应该怎么办呢?

获取分组之后的某一部分数据:
df.groupby(by=[“Country”,“State/Province”])[“Country”].count() -->Series类型

对某几列数据进行分组:
df[“Country”].groupby(by=[df[“Country”],df[“State/Province”]]).count() -->Series类型

t1 = df[[“Country”]].groupby(by=[df[“Country”],df[“State/Province”]]).count()
t2 = df.groupby(by=[“Country”,“State/Province”])[[“Country”]].count()
以上的两条命令结果一样,和之前的结果的区别在于当前返回的是一个DataFrame类型

7 索引

简单的索引操作:
获取index:df.index
指定index :df.index = [‘x’,‘y’]
在这里插入图片描述
重新设置index : df.reindex(index = list(“abcedf”)),如果新增加的索引值不存在,默认为 Nan,并且原来的df索引不变,如图还是a,b,c
在这里插入图片描述
指定某一列作为index :df.set_index(“Country”,drop=False),原来的df索引不变
在这里插入图片描述
返回index的唯一值:df.set_index(“Country”).index.unique()

从复合索引中取值:
1、Series
在这里插入图片描述
若想取索引h对应值
在这里插入图片描述
2、DataFrame
在这里插入图片描述

8 时间序列

8.1 生成一段时间

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

start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引
start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引
在这里插入图片描述

在这里插入图片描述
常见的频率:
在这里插入图片描述
在DataFrame中使用:

index=pd.date_range("20170101",periods=10)
df = pd.DataFrame(np.random.rand(10),index=index)

8.2 把时间字符串转化为时间序列

df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")

format参数大部分情况下可以不用写,但是对于pandas无法格式化的时间字符串,我们可以使用该参数,比如包含中文
在这里插入图片描述

8.3 重采样

重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程
pandas提供了一个resample的方法来帮助我们实现频率转化
在这里插入图片描述
练习:
统计出911数据中不同月份电话次数的变化情况
911文件head(5)
在这里插入图片描述

df = pd.read_csv(r"C:\Users\24291\Desktop\prepare\big_data\数据分析资料\day06\code\911.csv")
#将字符时间转换成日期
df['timeStamp'] = pd.to_datetime(df["timeStamp"],format="")
#重新设置索引
df = df.set_index('timeStamp')
#重采样
count_by_month = df.resample("M").count()['title']
#画图
_x = count_by_month.index  #DatetimeIndex对象,需转换成列表
_x_list = [i.strftime('%Y%m%d') for i in _x]
_y = count_by_month.values
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x_list)),_y)
plt.xticks(range(len(_x_list)),_x_list,rotation = 45)
plt.show

统计出911数据中不同月份不同类型的电话的次数的变化情况

df = pd.read_csv(r"C:\Users\24291\Desktop\prepare\big_data\数据分析资料\day06\code\911.csv")
#字符时间转换成日期
df['timeStamp'] = pd.to_datetime(df["timeStamp"],format="")
temp_list = df['title'].str.split(':').to_list()
cate_list = [i[0] for i in temp_list]
df['cate'] = pd.DataFrame(cate_list) #把分类新增到原来的911表格中

#重新设置索引要在新增列之后,因为如果一个索引在另一个中不存在,则会用Nan填充
df = df.set_index('timeStamp')

plt.figure(figsize=(20, 8), dpi=80)
for group_name,group_data in df.groupby(by="cate"):
    #对不同的分类都进行绘图
    count_by_month = group_data.resample("M").count()["title"]

    # 画图
    _x = count_by_month.index
    print(_x)
    _y = count_by_month.values

    _x = [i.strftime("%Y%m%d") for i in _x]

    plt.plot(range(len(_x)), _y, label=group_name)
    
plt.xticks(range(len(_x)), _x, rotation=45)    
plt.legend(loc="best")
plt.show()

8.4 生成时间段

PeriodIndex主要用于以下情况,时间段存储在不同的列上:
在这里插入图片描述

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

转换后的数据:
在这里插入图片描述
<class ‘pandas.core.indexes.period.PeriodIndex’>类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值