Pandas学习笔记

"""
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()
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值