文章目录
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的布尔索引
str.上述内容
str.tolist() 一维转换为列表
# 个数>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()
freq的参数如下
不同类型的的电话次数的统计
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矩阵统计,
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后
print(zeros_df)
df=df.join(zeros_df)
print(df)
分组groupby,汇总
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)
分组汇总练习
国家前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)