数据合并之 join
join:默认情况下他是行行索引相同的数据合并到一起
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((2,4)),index=["a","b"],columns=list("zxcv"))
df2 = pd.DataFrame(np.zeros((3,2)),index=list("123"),columns=list("12"))
print(df1.join(df2))
print(df2.join(df1))
总结:数据行合并 ——join
a:x行y列
b:m行n列
a.join(b) ——>(x+m)行y列
b.join(a) ——>(m+x)行n列
当某个数值本来没有时,用NaN填充
数据合并之merge
merge:按照指定列把数据按照一定的方式合并到一起
合并方式:
1.默认的合并方式:inner 交集
2.outer:并集,NaN补全
3.left:左边为准,NaN补全
4.right:右边为准,NaN补全
DataFrameGroupBy
1.可以进行遍历
2.可以调用聚合方法
import pandas as pd
import numpy as np
file_path = "starbucks_store_worldwide.csv"
df = pd.read_csv(file_path)
# print(df.head(1))
# print(df.info())
grouped = df.groupby(by="Country")
# print(grouped)
'''
DataFrameGroupBy
1.可以进行遍历
2.可以调用聚合方法
'''
#1. 进行遍历
for i,j in grouped:
print(i)
print("-"*50)
print(j)
print("*"*50)
# 按照grouped中分组方式分组后遍历输出
# print(df[df["Country"]=="US"])
#2.调用聚合方法
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/Province").count()["Brand"]
print(grouped)
#----按照多个条件进行分组,返回的是Series
grouped = df["Brand"].groupby(by=[df["Country"],df["State/Province"]]).count()
print(grouped)
print(type(grouped))
#----按照多个条件进行分组,怎么返回DataFrame?? [["Brand"]]
grouped1 = df[["Brand"]].groupby(by=[df["Country"],df["State/Province"]]).count()
grouped2 = df.groupby(by=[df["Country"],df["State/Province"]])[["Brand"]].count()
grouped3 = df.groupby(by=[df["Country"],df["State/Province"]]).count()[["Brand"]]
例题
现在我们有一组关于全球星巴克店铺的统计数据,如果我想知道美国的星巴克数量和中国的哪个多,或者我想知道中国每个省份星巴克的数量的情况,那么应该怎么办?
使用matplotlib呈现出店铺总数排名前10的国家
使用matplotlib呈现出中国每个城市的店铺的数量
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
matplotlib.rc("font", family='MicroSoft Yahei', weight='bold')
file_path = "starbucks_store_worldwide.csv"
df = pd.read_csv(file_path)
df =df[df["Country"]=="CN"]
# print(df.head(1))
#使用matplotlib呈现出中国每个城市的店铺的数量
#准备数据
data1 = df.groupby(by="City").count()["Brand"].sort_values(ascending=False)[:30]
_x = data1.index
_y = data1.values
#画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y,width=0.3,color="orange")
plt.xticks(range(len(_x)),_x)
plt.show()
现在我们有全球排名靠前的10000本书的数据
1.不同年份书的数量
2.不同年份书的评分情况
#现在我们有全球排名靠前的10000本书的数据
#1.不同年份书的数量
#2.不同年份书的评分情况
import matplotlib.pyplot as plt
import pandas as pd
file_path = "books.csv"
df = pd.read_csv(file_path)
# print(df.head(1).to_string())
#1.不同年份书的数量
data1 = df[pd.notnull(df["original_publication_year"])]
grouped = data1.groupby(by="original_publication_year").count()["title"]
#2.不同年份书的评分情况
#去除original_publication_year列中nan的行
data1 = df[pd.notnull(df["original_publication_year"])]
grouped = data1["average_rating"].groupby(by=data1["original_publication_year"]).mean()
_x = grouped.index
_y = grouped.values
#画图
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(list(range(len(_x)))[::10],_x[::10].astype(int),rotation=45)
plt.show()