""" Pandas的常用数据类型 Series一维,带标签数组 DataFrame二维,Series容器 Series对象本质上有两个数组构成 一个数组构成对象的键(index,索引) 一个数组构成对象的值(values) """ import pandas as pd t = pd.Series([1,2,31,12,3,4]) print(t) print(type(t)) # 创建的时候指定索引 t2 = pd.Series([1,23,2,2,1],index=list("abcde")) print(t2) print(t2.dtype) # 通过字典创建 temp_dict={"name":"xiaohong","age":30,"tel":10086} t3 = pd.Series(temp_dict) print(f"t3的内容是:{t3}") print(f"t3中的数据类型是:{t3.dtype}") # 取值 print(f"t3中索引为name的值是{t3['name']}") print(f"t3中第二行的值是:{t3.iloc[1]}") # 取前2行 print(f"t3中前2行的内容是:{t3[:2]}") # 取多行 print(f"t3中第2行和第3行的内容是:\n{t3.iloc[[1,2]]}") # 通过索引取多行 print(f"t3中索引为age,tel的值是:\n{t3[['age','tel']]}") ## pandas存在Series的索引和值 print(t3) print(t3.index) print(type(t3.index)) print(len(t3.index)) print(list(t3.index)) print(list(t3.index)[:2]) print(t3.values) print(type(t3.values)) # series具有where方法,但是结果和ndarray不同
""" pandas / pd 中存在很多方法来读取各种文件 read_csv read_excel ...... """ import pandas as pd # pandas读取csv中的文件 df = pd.read_csv("./dogNames2.csv") print(df) # pandas读取mysql中的数据 # pd.read_sql(sql_sentence,connection)
# pandas读取Mongodb中的数据 from pymongo import MongoClient import pandas as pd client = MongoClient() collection = client["douban"]["tv1"] data = list(collection.find()) print(data)
import pandas as pd import numpy as np # DataFrame对象既有行索引,又有列索引 # 行索引,表明不同行,横向索引,叫index,0轴,axis=0 # 列索引,表名不同列,纵向索引,叫columns,1轴,axis=1 t = pd.DataFrame(np.arange(12).reshape(3,4)) print(t) print(f"t的类型是{type(t)}") # t的类型是<class 'pandas.core.frame.DataFrame'> # 0 1 2 3 # 0 0 1 2 3 # 1 4 5 6 7 # 2 8 9 10 11 # 通过字典传入构建DataFrame数据 # 某个位置的数据缺失了,那么就会变成NaN d1 = {"name":["xiaoming","xiaohong"],"age":[20,32],"tel":[10086,10010]} t1 = pd.DataFrame(d1) print(t1) d2 = [{"name":"xiaohong","age":20,"tel":10010},{"name":"xiaogang","age":32},{"name":"xiaohong","tel":10086}] print(d2) t2 = pd.DataFrame(d2) print(t2) print(t2.index) print(t2.columns) print(t2.values) print(t2.shape) print(t2.dtypes) # 这样子更改数据 t2.loc[1,"age"] = np.nan print(t2) # 显示头几行 # print(df.head()) 默认前5行 # print(df.head(1)) 前1行 # print(df.tail(2)) 最后2行 # 展示df的概览 # print(df.info()) # print(df.describe())
# coding = utf-8 import pandas as pd df = pd.read_csv("./dogNames2.csv") # print(df.head()) # print(df.info()) # 统计名字使用次数最高的 # dataFrame中排序的方法 # ascending参数True代表升序,False代表降序 df = df.sort_values(by="Count_AnimalName",ascending=False) print(df.head(5))
# enconding = utf-8 import pandas as pd df = pd.read_csv("./dogNames2.csv") # 由名字使用次数排序,且降序排序 df = df.sort_values(by="Count_AnimalName",ascending=False) # - 方括号写数组,表示取行,对行进行操作 # - 写字符串,表示的取列索引,对列进行操作 # 取前20行 print(df[:20]) # 取前20行的Row_labels print(df[:20]["Row_Labels"]) # 取Row_Labels这一列 print(df["Row_Labels"]) # <class 'pandas.core.series.Series'> print(type(df["Row_Labels"])) # 同时取某些行和某些列,则使用loc方法 import numpy as np t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("WXYZ")) print(t3) print(t3.loc[["a","c"],["W","X"]]) print(t3.iloc[1,:])
""" 演示bool索引和缺失数据的处理 """ import numpy as np # pandas的字符串方法 import pandas as pd df = pd.read_csv("dogNames2.csv") # 找到所有使用次数大于800且小于1000的狗的名字 # 注意:不同条件需要用括号括起来 print(df[(800<df["Count_AnimalName"]) & (df["Count_AnimalName"]<1000)]) # 缺失数据的处理 # 有两种方法,删除nan所在的行列,填充数据 ## 删除nan所在的行列 t = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("WXYZ")) t.loc["a","W"] = np.nan print(t) # 是nan print(pd.isnull(t)) # 不是nan print(pd.notnull(t)) # t中W列中不为nan的行 print(t[pd.notnull(t["W"])]) # dropna方法 # 默认情况下,把有nan的行删掉 # how参数,any代表有一个就删,all代表全部是nan就删掉 # inplace参数,True代表就地修改 print(t.dropna(axis=0)) ## 填充数据 # 方法是fillna d2 = [{"name":"xiaohong","age":20,"tel":10010},{"name":"xiaogang","age":32},{"name":"xiaohong","tel":10086}] print(d2) t2 = pd.DataFrame(d2) print(t2) print(t2.fillna(100)) # 均值是xx.mean() # print(t2["age"].fillna(27)) # print(t2.fillna(t2.mean())) t2["age"] = t2["age"].fillna(t2["age"].mean()) print(t2) t2["tel"] = t2["tel"].fillna(t2["tel"].mean()) print(t2) # 这样子更改数据 t2.loc[1,"age"] = np.nan print(t2) print(t2["age"].mean())
""" 统计电影分类的情况 """ import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path = "./IMDB-Movie-Data.csv" df = pd.read_csv(file_path) # 展示分类情况 # print(df["Genre"]) # 统计分类的列表 temp_list = df["Genre"].str.split(",").tolist() # [[],[]...] print(temp_list) genre_list = list(set([i for j in temp_list for i in j])) # 构造全为0的数组 zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list) # print(zeros_df) # 给每个电影出现分类的位置赋值为1 for i in range(df.shape[0]): zeros_df.loc[i,temp_list[i]] = 1 # 统计每个分类的电影的数量和 genre_count = zeros_df.sum(axis=0) # print(genre_count) # 排序 genre_count = genre_count.sort_values() _x = genre_count.index _y = genre_count.values # print(_x) # print(type(_x)) # print(_y) # print(type(_y)) # 画图 plt.figure(figsize=(20,8),dpi=80) plt.bar(range(len(_x)),_y) plt.xticks(range(len(_x)),_x) plt.show()
""" join:默认情况下把行行索引相同的数据合并到一起 merge:按照指定的列吧数据按照一定的方式合在一起 """ import pandas as pd import numpy as np df1 = pd.DataFrame(np.ones((2,4)),index=["A","B"],columns=list("abcd")) df2 = pd.DataFrame(np.zeros((3,3)),index=["A","B","C"],columns=list("xyz")) # a.join(b) 以a的行数为基础 print((df2.join(df1))) df3 = pd.DataFrame(np.zeros((3,3)),columns=list("fax")) print(df1.merge(df3,on="a")) # right_on代表右边以什么为准,left_on代表左边以什么为准 # 内连接,默认下为内连接,how="inner",取交集 # 外连接,how="outer",取并集 # 左连接,how="left",以左边的为准,另一边不存在的补充nan # 右连接,how="right",以右边的为准,另一边不存在的补充nan
""" P34有点没听懂 现在我们有一组关于全球星巴克店铺的统计数据, 如果我想知道美国的星巴克数量和中国的哪个多, 或者我想知道中国每个省份星巴克的数量的情况, 那么应该怎么办? """ import pandas as pd import numpy as np file_path = "./starbucks_store_worldwide.csv" # 展示完全 pd.set_option('display.max_columns',None) pd.set_option('display.max_rows',None) df = pd.read_csv(file_path) # print(df.head(1)) # print(df.info()) grouped = df.groupby(by="Country") # print(grouped) # DataFrameGroupBy # 可以进行遍历 # for i,j in grouped: # print(i) # print("-"*100) # print(j,type(j)) # print("*"*100) # 调用聚合方法 # print(grouped.count()) # country_count = grouped["Brand"].count() # print(country_count["US"]) # print(country_count["CN"]) # 统计中国每个省份的店铺数量 china_data = df[df["Country"] == "CN"] # 现在先查询一下哪个数据是代表省份,使用info()方法 # print(df.info()) # # grouped = china_data.groupby(by="State/Province").count()["Brand"] # print(grouped) # print(type(df["Brand"])) Series # print(type(df)) DataFrame grouped = df["Brand"].groupby(by=[df["Country"],df["State/Province"]]).count() # print(grouped) # print(type(grouped)) # t1 = df["Brand"] # print(t1) # print(type(t1)) # 获取分组之后的某一部分数据 # print(df.groupby(by=["Country","State/Province"])["Country"].count()) # 对某几列数据进行分组 # print(df["Country"].groupby(by=[df["Country"],df["State/Province"]]).count()) # 索引 print(grouped.index)
""" """ import numpy as np import pandas as pd df1 = pd.DataFrame(np.ones((2,4)),index=["A","B"],columns=list("abcd")) print(df1) # 获取索引 print(df1.index) # 指定Index df1.index=["a","b"] print(df1.index) # 重新设置index print(df1.reindex(["a","f"])) # 指定某一项作为index,drop参数为False仍保留column的a数据 print(df1.set_index("a")) print(df1.set_index("a",drop=False)) # 返回index的唯一值,df.set_index("xx").index.unique() print(df1.set_index("a").index.unique()) a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c': ['one','one','one','two','two','two', 'two'],'d': list("hjklmno")}) print(a) print(a.set_index(["c","d"])) print(a.set_index(["c","d"])["a"]) X = a.set_index(["c","d"])["a"] print(X["one","h"])
""" 使用matplotlib呈现出店铺总数排名前10的国家 """ import pandas as pd from matplotlib import pyplot as plt 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()
""" 统计出911数据中不同月份电话次数的变化情况 统计出911数据中不同月份不同类型的电话的次数的变化情况 """ import pandas as pd from matplotlib import pyplot as plt import numpy as np # print(pd.date_range(start="20171230",end="20180131",freq="D")) # print(pd.date_range(start="20171230",end="20180131",freq="10D")) # print(pd.date_range(start="20171230",periods=10,freq="10D")) df = pd.read_csv("./911.csv") df["timeStamp"] = pd.to_datetime(df["timeStamp"]) df.set_index("timeStamp",inplace=True) count_by_month = df.resample("ME").count()["title"] print(count_by_month) # 画图 _x = count_by_month.index _y = count_by_month.values # for i in _x: # print(dir(i)) # break _x = [i.strftime("%Y%m%d") for i in _x] plt.figure(figsize=(20,8),dpi=80) plt.plot(range(len(_x)),_y) plt.xticks(range(len(_x)),_x,rotation=45) plt.show() #统计出911数据中不同月份不同类型的电话的次数的变化情况
#统计出911数据中不同月份不同类型的电话的次数的变化情况 import pandas as pd from matplotlib import pyplot as plt import numpy as np df = pd.read_csv("./911.csv") # 把时间字符串转化为时间类型设置索引 df["timeStamp"] = pd.to_datetime(df["timeStamp"]) # 添加列,表示分类 temp_list = df["title"].str.split(": ").tolist() cate_list = [i[0] for i in temp_list] df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1))) df.set_index("timeStamp",inplace=True) 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 _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()