Pandas

pandas 复杂类型

​ 列表,字符串,日期,字典…

pandas读取数据

df=pd.read_csv('./GK.csv')
print(df)
df=pd.read_csv('./datasets_IMDB-Movie-Data.csv')
# print(df)

# 获取平均评分
rating_mean=df["Rating"].mean()
print(rating_mean)

# 获取导演人数
# 1列表,2 集合,3 len
print(len(set(df['Director'].tolist())))

#演员人数

temp_Actors_list=df['Actors'].str.split(', ').tolist()
# print(temp_Actors_list)
actor_list=[i for j in temp_Actors_list for i in j ]
# print(actor_list)
actor_num=len(set(actor_list))
print(actor_num)

# 电影时长的最大最小值
max_runtime=df["Runtime (Minutes)"].max()           #最大值
max_runtime_index=df["Runtime (Minutes)"].argmax()  #最大值的下标
min_runtime=df["Runtime (Minutes)"].minx()           #最大值
min_runtime_index=df["Runtime (Minutes)"].argmin()  #最大值的下标



import pandas as pd
import numpy as np

from pymongo import MongoClient

client=MongoClient(host='127.0.0.1',port=27017)

collection=client['sn']['test']
data=list(collection.find())

# print(data)

#只提取需要的数据[{},{}] 方便pd.DataFrame
data_list=[]
for each_data in data:
    temp={}
    # print(each_data)

    temp['m_category']=each_data['m_category']
    temp['s_category']=each_data['s_category']
    temp['publisher']=each_data['publisher']
    temp['book_price']=each_data['book_price']
    data_list.append(temp)

df=pd.DataFrame(data_list)
print(df)
print(df.head())   #查看首5行,   n 查看指定行数
print(df.tail())   #查看尾5行   n  查看指定行数
print(df.info)      #查看每一列
print(df.describe())    #只查看关于数据列的描述

print(df.index,df.columns,df.values,df.shape,df.dtypes)

Series 一维 下标

#   Series列表,0,1,2,3,4     index 指定索引值,键值
t2=pd.Series(['a','b','c','d','e','f'],index=list("abcdef"))
print(t2)
#   Series也可以是一个字典
person={'name':'张三','age':18,'sex':'男'}
t2=pd.Series(person)
print(t2)

#   取用元素,索引,键,切片
print(t2[1],t2['name'],t2[:2],t2[[1,2]])

#取数组t2的索引, 是一个可迭代的对象
print(t2.index)

DataFrame 二维

import pandas as pd
import numpy as np

list1=[{'stu1':['张三','李四','王五']}]

print(pd.Series(list1[0]))

#   在创建二维的时候,指明了 列名,行名
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list(("abc")),columns=list(("0123")))
print(t1)
#    0  1   2   3
# a  0  1   2   3
# b  4  5   6   7
# c  8  9  10  11

#DataFrame 二维,字典->table,这里的个数是必须要一直的,3个姓名,3个年龄,3个性别
# 纯字典/json ->table
dist_stu={'name':['张三','李四','王五'],'age':[12,14,15],'sex':[0,0,1]}
stu=pd.DataFrame(dist_stu)
print(stu)

#列表+字典/json ->table  没有的键/列会自动填充NaN
dist_stu1=[{'name':'张三','age':18,'sex':0},{'name':'李四','age':20},{'name':'王五'}]
stu=pd.DataFrame(dist_stu1)
print(stu)
#   name   age  sex
# 0   张三  18.0  0.0
# 1   李四  20.0  NaN
# 2   王五   NaN  NaN

DataFrame只提取需要的数据

import pandas as pd
import numpy as np

from pymongo import MongoClient

client=MongoClient(host='127.0.0.1',port=27017)

collection=client['sn']['test']
data=list(collection.find())

# print(data)

#只提取需要的数据[{},{}] 方便pd.DataFrame
data_list=[]
for each_data in data:
    temp={}
    # print(each_data)

    temp['m_category']=each_data['m_category']
    temp['s_category']=each_data['s_category']
    temp['publisher']=each_data['publisher']
    temp['book_price']=each_data['book_price']
    data_list.append(temp)

df=pd.DataFrame(data_list)
print(df)
print(df.head())   #查看首5行,   n 查看指定行数
print(df.tail())   #查看尾5行   n  查看指定行数
print(df.info)      #查看每一列
print(df.describe())    #只查看关于数据列的描述

print(df.index,df.columns,df.values,df.shape,df.dtypes)

DataFrame排序,前5

df=pd.read_csv('./dogNames2.csv')
# DataFrame 中的排序的方法
df=df.sort_values(by="Count_AnimalName") #升序
df=df.sort_values(by="Count_AnimalName",ascending=False) #降序
print(df.head(5))	#前五
print(df[4:10])		#4-10

DataFrame 取行,列loc,iloc

在这里插入图片描述

​ 数字 iloc

​ 字符串 loc

W X Y Z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11

t3=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))
print(t3)

# loc 字符串
print(t3['X'])          #取列
print(t3.loc['a'])      #取行
print(t3.loc[:,'Y'])    #取列
print(t3.loc['a','Y'])  #取行列
print(t3.loc[['a','c'],['W','Y']]) #取多行,多列

# iloc  下标
print(t3.iloc[0])       #取行
print(t3.iloc[:,1])     #取列
print(t3.iloc[2,3])
print(t3.iloc[[0,2],[0,3]]) #取多行多列

DataFrame的布尔索引

image-20210309115448336

str.上述内容

str.tolist() 一维转换为列表

image-20210309122557899

# 个数>10
print(df[df['Count_AnimalName']>10])
# 个数>10 且 个数<50
print(df[(df['Count_AnimalName']>10) & (df['Count_AnimalName']<50) ])
print(df[(df['Count_AnimalName']>10) | (df['Count_AnimalName']<50) ])

# 长度>4
print(df[df['Row_Labels'].str.len()>4])

缺失值的处理 0或者Null

#   缺省值的处理
t3=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))
t3.iloc[[1,2],[1,2]]=np.nan
print(t3)
#   判断是否有Nan
print(pd.isnull(t3))
print(pd.notnull(t3))
#   删除空值 0 是行,1是列
t3=t3.dropna(axis=0,how="all")              #行内,全部Nan就删除
t3=t3.dropna(axis=0,how="any")              #行内,任一Nan就删除
t3.dropna(axis=0,how="any",inplace=True)    #inplace 原地替换
print(t3)
#   填充空值
print(t3.fillna(100))           #所有的nan填充为100
print(t3.fillna(t3.mean()))     #所有的nan填充为均值
print(t3["X"].fillna(t3['X'].mean()))   #填充指定的X的nan为均值

#   处理0值 ,将所有的0值,替换为Nan,然后填充空值处理即可
t3[1,2]=0
print(t3)
t3[t3==0]=np.nan
print(t3)

多表链接merge

import numpy as np
import random
import pandas as pd

df1=pd.DataFrame(np.arange(12).reshape(2,6),index=list("12"),columns=list("abcdef"))
print(df1)

df2=pd.DataFrame(np.arange(16).reshape(4,4),index=list("1234"),columns=list("acgh"))
print(df2)
# 内连接
df3=df2.merge(df1,on="a",how="inner") 
print(df3)
# 有外连接 ,没有的nan
df3=df2.merge(df1,on="a",how="right")
print(df3)
# 做外链接,没有的nan
df3=df2.merge(df1,on="a",how="left")
print(df3)
# 全外链接,没有的nan
df3=df2.merge(df1,on="a",how="outer")
print(df3)

时间字段(时间序列)

data=pd.date_range(start='20101010',end='20151010',periods=10,freq='D')
# periods 个数, 显示10个
# start 开始日期,end  结束日期

print(data)

# 将时间字符串,转换为时间
df["timeStamp"]=pd.to_datetime(df["timeStamp"]) 
# 设置为时间索引
df.set_index("timeStamp",inplace=True)

#  将离散的年月日,时分秒,拼接在一起, 然后小时为序列
period=pd.PeriodIndex(year=df["year"],month=df["month"],day=df["day"],hour=df["hour"],freq="H")
# print(period)
df["datetime"]=period
df.set_index(df["datetime"],inplace=True)
# 对时间进行降采样
df =df.resample("7D").mean()

image-20210311105518301

freq的参数如下

image-20210309211803259

不同类型的的电话次数的统计

import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

df=pd.read_csv('./911.csv')

# 转换为日期字段
df["timeStamp"]=pd.to_datetime(df["timeStamp"])
# 设置为时间索引
df.set_index("timeStamp",inplace=True)

# print(df.head(5))

count_by_month=df.resample('M').count()["title"]
print(count_by_month)

plt.figure(figsize=(20,8),dpi=80)

_x=count_by_month.index
_y=count_by_month.values

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

plt.plot(range(len(_x)),_y)

plt.xticks(range(len(_x)),_x,rotation=45)

plt.show()

每月不同类型的电话次数的统计

import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

df=pd.read_csv('./911.csv')
# 统计不同月份,不同类型的电话的次数的变化情况

# 转换为日期字段
df["timeStamp"]=pd.to_datetime(df["timeStamp"])


temp_list=df["title"].str.split(": ")
cate_list=[i[0] for i in temp_list]
# print(cate_list)

df["cate"]=pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))
# 二次重置索引,因为pd.DataFrame 的将索引改变了
df.set_index("timeStamp",inplace=True)
print(df)

# 先统计不同类型的电话的次数

plt.figure(figsize=(20,8),dpi=80)
for group_name,group_data in df.groupby(by="cate"):
    print(group_name,group_data)

    count_by_month=group_data.resample("M").count()["title"]

    _x=count_by_month.index
    _y=count_by_month.values

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

    plt.plot(range(len(_x)),_y)

plt.xticks(range(len(_x)),_x,rotation=45)
plt.show()

年/月/日的拼接,汇总

import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

df=pd.read_csv('./PM2.5/BeijingPM20100101_20151231.csv')
# 统计不同月份,不同类型的电话的次数的变化情况

# 转换为日期字段

print(df.head())
print(df.info())

#  将离散的年月日,时分秒,拼接在一起, 然后小时为序列
period=pd.PeriodIndex(year=df["year"],month=df["month"],day=df["day"],hour=df["hour"],freq="H")
# print(period)
df["datetime"]=period

df.set_index(df["datetime"],inplace=True)

# 对时间进行降采样
df =df.resample("7D").mean()

data=df["PM_US Post"].dropna()
# print(data)
data_china=df["PM_Dongsihuan"]


plt.figure(figsize=(20,8),dpi=80)

_x=data.index
_x_china=data_china.index
_y=data.values
_y_china=data_china.values

plt.plot(range(len(_x)),_y,label="US")
plt.plot(range(len(_x_china)),_y_china,Label="china")

plt.xticks(range(len(_x))[::10],list(_x)[::10],rotation=45)
plt.legend(loc="best")

plt.show()

分类汇总

统计/汇总思路

全0矩阵统计,

image-20210309151559719

import pandas as pd
import numpy as np
from pymongo import MongoClient
from matplotlib import pyplot as plt

client=MongoClient(host='127.0.0.1',port=27017)
collection=client['sn']['test']

df=pd.read_csv('./datasets_IMDB-Movie-Data.csv')
# print(df)

# 统计不同分类的电影的个数  全0 矩阵 +1

temp_genre_list=df["Genre"].str.split(",").tolist()
print(temp_genre_list)
genre_list=[i for j in temp_genre_list for i in j ]
print(genre_list)
# set 列表去重,输出字典
genre_list=list(set(genre_list))

# 构建全0矩阵
zeros_df=pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
# print(zeros_df)

for i in range(df.shape[0]):
    zeros_df.loc[i,temp_genre_list[i]]=1

# print(zeros_df)
#   按列分类汇总
genre_count=zeros_df.sum(axis=0)
genre_count=genre_count.sort_values()
print(genre_count)

_x=genre_count.index
_y=genre_count.values

# 画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y)

# 增加刻度 ,x轴,电影分类名
plt.xticks(range(len(_x)),_x)

plt.show()
全0矩阵统计,含有
import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

df=pd.read_csv('./911.csv')

print(df.head(1))
print(df.info)
# 获取电话类别
temp_cate_list=df['title'].str.split(": ")
cate_list=set([i[0] for i in temp_cate_list])

# 构建全0矩阵
zeros_cate=pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
# print(zeros_cate)

# 开始填充1

for cate in cate_list:
    zeros_cate[cate][df["title"].str.contains(cate)]=1

print(zeros_cate)

#  每种类型的电话的拨打的总数
print(zeros_cate.sum(axis=0))

# 开始填充1
for i in range(df.shape[0]):
    zeros_cate.loc[i,temp_cate_list[i][0]]=1
#  每种类型的电话的拨打的总数
# print(zeros_cate)
print(zeros_cate.sum(axis=0))
新增一列统计
import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置

df=pd.read_csv('./911.csv')

print(df.head(1))
print(df.info)
# 获取电话类别
temp_cate_list=df['title'].str.split(": ")
cate_list=[i[0] for i in temp_cate_list]

print(cate_list)
df["cate"]=pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))
print(df)

# 统计每种类型的电话的拨打的次数
print(df.groupby(by="cate").count()["title"])

join 将全0矩阵按index 拼接到df后

image-20210309153925032

print(zeros_df)
df=df.join(zeros_df)
print(df)

分组groupby,汇总

image-20210309163821736

import numpy as np
import random
import pandas as pd

df=pd.read_csv('./directory.csv')
print(df.info)

grouped=df.groupby(by="Country")
# 1.groupby  可以迭代  ,每一组就是一个国家的数据
for i in grouped:
    print(i)
# 2 .可以聚合, max,min,sum,avg,count
country_count=grouped["Brand"].count()
print(country_count['US'])
print(country_count['CN'])
print(country_count)

grouped=df.groupby(by=["Country"]).count()["Brand"]
print(grouped)

# 统计中国每一地区的星巴克的数量
grouped=df.groupby(by="City").count()['Brand']
print(grouped)
# 返回的是series 一维数组
grouped=df["Brand"].groupby(by=[df["Country"],df["City"]]).count()
print(grouped)
# 返回的dataFrame 二维
grouped=df[["Brand"]].groupby(by=[df["Country"],df["City"]]).count()
print(grouped)

分组汇总练习

image-20210309211549982

国家前10的店铺,中国的店铺的详情
import numpy as np
import random
import pandas as pd
from matplotlib import pyplot as plt

df=pd.read_csv('./directory.csv')

print(df.head(1))
print(df.info)
# 得到店铺总数前10的国家的信息,
data_q10=df.groupby(by="Country").count()['Brand'].sort_values(ascending=False)[:10]
print(data_q10)

# 中国的店铺详情

china_data=df[df["Country"]=="CN"]
print(china_data)

grouped=china_data.groupby(by="City").count()['Brand'].sort_values(ascending=False)[:25]
print(grouped)

_x=grouped.index # 城市名
_y=grouped.values #店铺数量


# 开始画图
_x=data_q10.index  #国家名称 x轴
_y=data_q10.values #店铺总数 y轴

# 设置图片大小
plt.figure(figsize=(20,8),dpi=80)
# 绘制条形图 
plt.bar(range(len(_x)),_y,color="orange")
# 设置x轴坐标
plt.xticks(range(len(_x)),_x)

plt.show()

# 横向条形图
plt.figure(figsize=(20,8),dpi=80)
plt.barh(range(len(_x)),_y,color="orange")

plt.yticks(range(len(_x)),_x)
plt.show()

df=pd.read_csv('./book.csv')

# print(df.head(1))
# print(df.info)

grouped=df["rating"].groupby(by=df["year"]).mean().sort_values(ascending=False)[:5]
print(grouped)

image-20210309210219986

索引

image-20210309173210799

image-20210309190242823

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值