pandas_数据的合并和分组聚合

1.字符串离散化(统计电影分类)

import pandas as pd
import numpy as np
file_pat = "./IMDB-Movie-Data.csv"

df = pd.read_csv(file_path)

#统计分类的列表
temp_list=df["Genre"].str.split(",").tolist()
genre_list = list(set([i for j in temp_list for i in j]))

#构建全为0的数组
zero_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

#print(zers_df.head(3))

#每个分类的电影的数量和
genre_count = zeros_df.sum(axis=0)
print(genre_count)

#排序
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)
plt.xticks(range(len(_x)),_x)
plt.show()

2.数据合并

join:把行索引相同的数据合并在一起

import pandas as pd
df1 = pd.DataFrame(np.ones(2,4),index=["A","B"],colunms=list("abcd"))
df2 = pd.DataFrame(np.ones(3,3),index=["A","B","C"],colunms=list("xyz"))
df1.join(df2)
df2.join(df1)

merge:把列索引相同的数据合并在一起

df3 = pd.DataFrame(np.zeros((3,3)),columns=list("fax"))
df1.merge(df3,on="a) #按照a进行合并
df3.loc[1,"a"] = 1
#内连接
df1.merge(df3,on="a) 
#外连接
df1.merge(df3,on="a,how="outer") #对应补齐
df1.merge(df3,on="a,how="left") #显示df1
df1.merge(df3,on="a,how="right") #显示df3

3.数据的分组聚合

星巴克店铺数量统计

import pandas as pd
import numpy as np

file_path="./starbucks_store_worldwide.csv"

pd.read_csv(file_path)

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

#可以进行遍历
for i,j in grouped:
	print(i)
	print(j,type(j))

df[df["Country"]]="US"

#调用聚合方法
country_count = grouped["Brand"].count()
print(country_count["US"])
print(country_count["CN"])

#统计中国各个省份星巴克的数量
china_data = df[df["Country"] == "CN"]
grouped = china_data.groupby(by="State/Provice").count()["Brand"]

print(grouped)

#对国家和省份同时进行分组
grouped = china_data.groupby(by=[df["Country"],df["State/Province"]]).count()["Brand"]

#数据按照多个条件进行分组,返回Seeries
df["Brand"].grouped(by=[df["Country"],df["Country"]])

#数据按照多个条件进行分组,返回DataFrame
grouped = df[["Brank"]].grouped(by=[df["Country"],df["Country"]])

#取1列,两个[]可以取DataFrame

4.数据的索引

#索引的方法和树形
group1 = df[["Brank"]].grouped(by=[df["Country"],df["Country"]])
df1.index = ["a","b"] #重新赋值
df1.reindex("a","f") #对df重新取,有就有,没有就NaN
df1.set_index("a") #把a这一列变成索引
df1.set_index("a").index
df1.set_index("a",drop=False) #仍然保留a
df1.set_index("b").index #索引可以是重复的
df1.set_index("b").index.unique()
len(df1.set_index("b").index.unique())

df1.set_index(["a","b"]) #设置两个索引
df1.set_index(["a","b","d"],drop=False) #设置3个索引

5.通过索引取值

a = pd.DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':list("hjklmno")})
b=a.set_index(["c","d"])
c["one"]["j"]
c["one"]
d = a.set_index(["d","c"])["a"]

d.swaplevel()["one"]
b.loc["one"].loc["h"]
b.swaplevel().loc["h"] #从内层进行选取dataframe loc取 series 两个方括号进行取
#店铺总数排名前10的国家
import pandas as pd
import numpy as np

file_path="./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)

#准备数据
data1 = df.groupby(by="Country").count()["Brand"].sort_values(ascending=False)[:10]
_x = data1.index
_y = data1.values

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

#中国每个城市的店铺数量
import pandas as pd
import numpy as np

file_path="./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)
df = df[df["Country"]=="CN"]

#准备数据
data1 = df.groupby(by="City").count()["Brand"].sort_values(ascending=False)[:50]

_x = data1.index
_y = data1.values

#画图
plt.figure(figsize=(20,12),dpi=80)
plt.bar(range(len(_x),_y),width=0.3,color="orange")
plt.xticks(range(len(_x),_x))
plt.show()
#全球排名靠前的10000本书的数据

#不同年份书的数量
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./books.csv"

df = pd.read_csv(file_path)

#删除缺失字段
data1 = df.[pd.notnull(df["original_publication_year"])]
grouped = data1.groupby(by="original_publication_year").count()["title"]

#不同年份书的平均评分情况
#去除nan的行
data1 = df.[pd.notnull(df["original_publication_year"])]
grouped = data1["average_rating"].groupby(by=data1[original_publication_year]).mean()

print(grouped)

_x  = grouped.index
_y = grouped.values

plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(len(_x)))[::10],_x[::10].astype(int),ratation=45))
plt.show()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值