pandas學習筆記(代碼部分)

1.pandas的Series的一些基礎屬性

import pandas as pd
# Serise一維數組,DataFrame二維數組

# 創建一維Series
t1 = pd.Series([1,3,5,6,8])
print(t1, '\n')
# 創建一維Series,並修改對應序號
t2 = pd.Series(range(5), index=list("abcde"))
print(t2, '\n')
# 通過字典來創建Series,鍵爲索引,值爲值
temp_dict = {'a':1,'b':2,'c':3,'d':4}
t3 = pd.Series(temp_dict)
print(t3, '\n')

"""索引與切片"""
# 只取某個值
print("t3[1]=", t3[1], '\n')
print("t3['a']=", t3['a'], '\n')
# 取連續值
print("t3[:2]=\n",t3[:2], '\n')
print("t3[1:3]=\n", t3[1:3] , '\n')
# 取不連續的多個值
print("t3[[0,2,3]] = \n", t3[[0,2,3]], '\n')
# 在取不連續的多個值時,若索引在Series中沒有該值,則輸出NAN
# print("t3[['a','f']]=\n", t3[['a','f']], '\n')

# 取Series的鍵通過index方法
t4 = t3.index
print("t3.index = ", t3.index, '\n')
for i in t4:    # 索引index
    print(i)
# 將Series的值轉成數組
t5 = t3.values
print("t3.value = ", t5, '\n')
print(type(t5), '\n')   # 其類型爲nampy的數組類型,而numpy中的一些方法也可用於Series,如argmax,clip

2.DataFrame的一些屬性和方法

在這裏插入圖片描述1.df.loc 通過標籤索引行數據
2.df.iloc 通過位置獲取行數據
通過標籤索引通過位置索引3.賦值更改數據的過程:
在這裏插入圖片描述4.字符串的一些用法
在這裏插入圖片描述

import pandas as pd
import numpy as np
# 讀取csv數據
df = pd.read_csv("E:/py_application/mplt_np_pda/dogNames2.csv")
print(df,'\n')
"""
DataFrame對象具有行索引,又有列索引
行索引,表明不同行,橫向索引,叫index,0軸,axis = 0
列索引,表明不同例,縱向索引,叫columns,1軸,axis = 1
"""
t1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("defg"))
# index設置行索引,columuns設置列索引
print(t1, '\n')
"""可以用字典,列表等來創建DataFrame"""

"""DataFrame的基礎屬性"""
print("shape = ", df.shape, '\n')
print("dtypes:\n", df.dtypes, '\n')
print("df.ndim = ", df.ndim, '\n')
print("df.index = ", df.index, '\n')
print("df.columns = ", df.columns, '\n')
print("df.value =\n", df.values, '\n')

"""DataFrame的整體情況查詢"""
# 顯示頭幾行,默認5行
print("df.head():\n", df.head(), '\n')
# 顯示尾幾行,默認5行
print("df.tial():\n", df.tail(), '\n')
# 展示df的概述
print("df.info():\n", df.info(), '\n')
print("df.describe:\n", df.describe(), '\n')


"""DataFrame的排序"""
df1 = df.sort_values(by = "Count_AnimalName",ascending=False )# 參數by是用來指定按誰來排序,這裏是按Count_AnimalName來排序,ascending指升序(True)還是降序(False)
print(df1.head(5))

"""pandas取行取列的操作,索引"""
# - 方括號寫數組表示取行,對行進行操作
# - 方括號些字符串,表示的取列索引,對列進行操作

print(df[:20], '\n')  # 取前20行
print(df["Row_Labels"],'\n') # 取Row_Labels這一列

# df.loc[ ,] 通過 "標籤" 索引數據,第一個參數爲行,第二個參數爲列
print(df.loc[[1,3,9],"Count_AnimalName"], '\n')       # 獲得1,3,9行的Count_AnimalName列的數據

# df.iloc[ , ]通過 "位置" 獲得數據,第一個參數爲行,第二個參數爲列
print(df.loc[[1,3,9],:], '\n')       # 獲得1,3,9行的所有列的數據

# pandas 之布爾索引
print(df[(800<df["Count_AnimalName"])&(df["Count_AnimalName"]<1000)]) #取出Count_AnimalName在800到1000之間的數據

3.缺失數據的處理

判斷數據是否爲NaN:pd.isnull(df),pd.notnull(df)

處理方式1:刪除NaN所在的行列dropna (axis=0, how=‘any’, inplace=False)
處理方式2:填充數據,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)

"""pandas中缺失數據的處理

判斷數據是否爲NaN:pd.isnull(df),pd.notnull(df)

處理方式1:刪除NaN所在的行列dropna (axis=0, how='any', inplace=False)
處理方式2:填充數據,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)

處理爲0的數據:t[t==0]=np.nan
當然並不是每次爲0的數據都需要處理
計算平均值等情況,nan是不參與計算的,但是0會
"""
import pandas as pd
import numpy as np

t1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
print(t1, '\n')
t1["w"]["a"] = np.nan
print(t1, '\n')
print(pd.isnull(t1), '\n')
print(pd.notnull(t1), '\n')

# 刪除NaN的所在行或列t1.dropna(axis ,how,inplace)
# axis=0:刪除NaN所在行;axis=1:刪除NaN所在列
# how ="any":只要有一個NaN就刪,how = "all":全部爲NaN才刪
# inplace表示所作操做是否原地修改,(True)是,反之
t2 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))
t2["w"]["a"] = np.nan
print(t2.dropna(axis=0, how="any", inplace=True))
print("t2:\n", t2)

# 填充NaN處的數據pd.fillna(),在w的NaN處填充w列的均值
print(t1)
t3 = t1["w"].fillna(t1["w"].mean())
print("t1:\n", t3)

4. pandas 中的統計方法

"""pandas 中的統計方法"""
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager

# 設置字體
my_font = font_manager.FontProperties(fname = "C:/Windows/Fonts/simsun.ttc")


file_path = "E:/py_application/mplt_np_pda/IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)
#print(df.info())
print(df.head(1))

# 獲取平均評分
Rating_mean = df["Rating"].mean()
print("平均分:", Rating_mean, '\n')

# 獲取導演的人數
Director_num = len(set(df["Director"].tolist()))
# Director_num = len(df["Director"].unique())
print(set(df["Director"].tolist()), '\n')
print("導演人數:", Director_num, '\n')

# 獲取演員的人數
temp_actor_list = df["Actors"].str.split(",").tolist()
actor_list = [i for j in temp_actor_list for i in j]  # 把列表展開
actor_num = len(set(actor_list))
print("演員的人數", actor_num, '\n')

# 設置圖片大小
plt.figure(figsize=(20, 8), dpi=80)

# 畫出rating,runtime的分佈情況
# 直方圖
rating_list = df["Rating"].values
runtime_list = df["Runtime (Minutes)"].values

# print(rating_list, '\n')
# print(runtime_list,'\n')

# 最大最小值
max_rating = rating_list.max()
min_rating = rating_list.min()
dif_rating = max_rating - min_rating +0.1
print("dif_rating", dif_rating, '\n')

max_runtime = runtime_list.max()
min_runtime = runtime_list.min()
dif_runtime = max_runtime - min_runtime
print("dif_runtime",dif_runtime, '\n')

# 組距
num_bin_rating = dif_rating/0.4
num_bin_runtime = dif_runtime//5



"""runtime"""
# 設置x軸
plt.xticks(range(min_runtime, max_runtime+5, 5))
# 畫直方圖
plt.hist(runtime_list, num_bin_runtime)
# 添加描述信息
plt.xlabel("電影時長",fontproperties = my_font)
plt.ylabel("數量",fontproperties = my_font)

"""rating(ctrl+/,註釋或取消註釋)"""
# # 設置x軸
# x = [i/2 for i in range(27)]
# print(x)
# plt.xticks(x)
# # 畫直方圖
# plt.hist(rating_list, int(num_bin_rating))
# # 添加描述信息
# plt.xlabel("電影評分",fontproperties = my_font)
# plt.ylabel("數量",fontproperties = my_font)


# 設置網格
plt.grid()

plt.show()

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
import numpy as np

my_fond = font_manager.FontProperties(fname = "C:/Windows/Fonts/simsun.ttc")
df = pd.read_csv("E:/py_application/mplt_np_pda/IMDB-Movie-Data.csv")
print(df.head(1), '\n')

# 統計分類的情況
temp_list = df["Genre"].str.split(",").tolist()
print(temp_list, '\n')
genre_list = list(set([i for j in temp_list for i in j]))

# 構造全爲零的數組
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
print(zeros_df, '\n')

# 給每個電影位置賦1
for i in range(df.shape[0]):
    print(temp_list[i], '\n')
    zeros_df.loc[i, temp_list[i]] = 1
print(zeros_df, '\n')

# 每個電影上數量的和
genre_count = zeros_df.sum(axis = 0)
print(genre_count, '\n')

# 排序
genre_count = genre_count.sort_values()
print(genre_count, '\n')

# 畫圖
plt.figure(figsize=(20,8), dpi=80)

_x = genre_count.index
_y = genre_count.values

plt.bar(_x, _y)

plt.show()

5.分組聚合

1.在pandas中類似的分組的操作我們有很簡單的方式來完成
df.groupby(by=“columns_name”)
2.groupby方法之後返回的是一個DataFrameGroupBy對象,是可迭代的
3.grouped中的每一個元素是一個元組,元組裏面是(索引(分組的值),分組之後的DataFrame)
4.DataFrameGroupBy對象有很多經過優化的方法
在這裏插入圖片描述5.獲取分組之後的某一部分數據:
df.groupby(by=[“Country”,“State/Province”])[“Country”].count()

6.對某幾列數據進行分組:
df[“Country”].groupby(by=[df[“Country”],df[“State/Province”]]).count()

import pandas as pd
import numpy as np

df = pd.read_csv("E:/py_application/mplt_np_pda/starbucks_store_worldwide.csv")
print("df:\n", df, '\n')
print("df.head(1):\n", df.head(1), '\n')
print("df.info():\n", df.info(), '\n')

# 按國家進行分組
grouped = df.groupby(by = "Country")
# 此時的grouped爲一個元組,第一個元素爲Country的信息,第二個爲DataFrame
# grouped中的每一個元素是一個元組,元組裏面是(索引(分組的值),分組之後的DataFrame)

print("grouped:\n", grouped, '\n')
print("df:\n", df, '\n')

# grouped的類型爲DataFrameGroupBy
# DataFrameGroupBy的公能有
# 1.可以進行遍歷
# for i,j in grouped:
#     print(i)        # i爲國家的信息
#     print("-"*100)
#     print(j)        # j爲DataFrame的信息
#     print("*"*100)

# 取某一個國家的數據的辦法
data_US = df[df["Country"] == "US"]
print("data_US:\n", data_US, '\n')

# 2.調用聚合方法
print(grouped.count(), '\n')
country_count = grouped["Brand"].count()
print(country_count["US"], '\n')
print(country_count["CN"], '\n')

# 統計中國每個省份Brand的數量
data_CN = df[df["Country"] == "CN"]
grouped_CN = data_US.groupby(by="State/Province")["Brand"].count()
print("grouped_CN:\n", grouped_CN, '\n')

# 數據按照多個條件分組,返回Series
print(df["Brand"].groupby(by=[df["Country"], df["State/Province"]]).count())
grouped1 = df["Brand"].groupby(by=[df["Country"], df["State/Province"]]).count()

# 數據按照多個條件分組,返DataFrame
print(df[["Brand"]].groupby(by=[df["Country"], df["State/Province"]]).count())
grouped1 = df[["Brand", "Street Address"]].groupby(by=[df["Country"], df["State/Province"]]).count()
grouped2 = df.groupby(by=[df["Country"], df["State/Province"]])[["Brand", "Phone Number"]].count()
print(grouped1, type(grouped1), '\n')
print("-"*100)
print(grouped2, type(grouped2), '\n')

6.索引與複合索引

1簡單的索引操作:
獲取index:df.index
指定index :df.index = [‘x’,‘y’]
重新設置index : df.reindex(list(“abcedf”))
指定某一列作爲index :df.set_index(“Country”,drop=False)
返回index的唯一值:df.set_index(“Country”).index.unique()

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(12).reshape(3,4),index=["a", "b", "c"],columns=list("wxzc"))
print("df:\n", df, '\n')
# 獲取index
print("df.index", df.index, '\n')
# 指定index
df.index = [1, 2, 3]
print("df.index", df.index, '\n')
print("df:\n", df, '\n')

# 重新設定index
df.index = ["a", "b", "c"]
print("df.reindex[a,c]:\n", df.reindex(["a", "c"]), '\n')
print("df:\n", df, '\n')

# 把某一列作爲索引
df1 = df.set_index("w", drop=False)  # 把w列作爲索引,但不從df中刪除w這一列
print("df1:\n", df1, '\n')
df2 = df.set_index("w", drop=True)  # 把w列作爲索引,並從df中刪除w這一列
print("df2:\n", df2, '\n')

# 設置多列索引(複合索引)
df3 = df.set_index(["w","x"])
print("df3:\n", df3, '\n')

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

# 取數據
t = df6["a"]    # t爲series類型
print(type(t), '\n')
print(t["one"]["k"], '\n')
print(df6.loc["one", "h"], '\n')    # 取df6(one, h)

# 交換列索引
df7 = df6.swaplevel()
print("df7:\n", df7, '\n')
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname = "C:/Windows/Fonts/simsun.ttc")
"""使用matplotlib呈現出店鋪總數排名前10的國家"""
df = pd.read_csv("E:/py_application/mplt_np_pda/starbucks_store_worldwide.csv")
# print("df:\n", df, '\n')
#
# data1 = df.groupby(by="Country").count()["Brand"].sort_values(ascending=False)[:10]
# print("data1:\n", data1, '\n')
#
# _x = data1.index
# _y = data1.values
#
# # 畫圖
#
# plt.figure(figsize=(20, 8), dpi=80)
#
# plt.xticks(range(len(_x)), _x)
#
# plt.bar(range(len(_x)), _y)
#
# plt.show()

"""使用matplotlib呈現出每個中國每個城市的店鋪數量"""
df1 = df[df["Country"]=="CN"]
print("df1:\n", df1, '\n')
data1 = df1.groupby(by="City").count()["Brand"].sort_values(ascending=False)[:10]
print("data1:\n", data1, '\n')

_x = data1.index
_y = data1.values

# 畫圖

plt.figure(figsize=(20, 8), dpi=80)

plt.xticks(range(len(_x)), _x , fontproperties=my_font)

plt.bar(range(len(_x)), _y, width=0.3)

plt.show()
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.read_csv("E:/py_application/mplt_np_pda/911.csv")
# print("df:\n", df, '\n')
print("df.head(5):\n", df.head(5), '\n')
print("df.info:\n", df.info(), '\n')

# 獲取分類
# print(df["title"].str.contains(), '\n')
# print(df["title"].str.split(": ").tolist())
temp_list = df["title"].str.split(": ").tolist()
cater_list = list(set([i[0] for i in temp_list]))
print(cater_list, '\n')

# 構造全爲0的數組
zeros_df = pd.DataFrame(np.zeros((df.shape[0], len(cater_list))),columns=cater_list)

# 賦值
for cate in cater_list:
    zeros_df[cate][df["title"].str.contains(cate)] = 1
print(zeros_df)

# for i in temp_list:
#     zeros_df.loc[i,temp_list[i][0]] = 1
# print(zeros_df)

# 結果
result_sum = zeros_df.sum(axis = 0)
print(result_sum, '\n')

7.時間序列

1.pd.date_range(start=None, end=None, periods=None, freq=‘D’)

start和end以及freq配合能夠生成start和end範圍內以頻率freq的一組時間索引
start和periods以及freq配合能夠生成從start開始的頻率爲freq的periods個時間索引
freq的一些參數2.DataFrame中使用時間序列
df[“timeStamp”] = pd.to_datetime(df[“timeStamp”],format="")

format參數大部分情況下可以不用寫,但是對於pandas無法格式化的時間字符串,我們可以使用該參數,比如包含中文

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.read_csv("E:/py_application/mplt_np_pda/911.csv")

temp_list = df["title"].str.split(": ").tolist()
cater_list = [i[0] for i in temp_list]

cater_df = pd.DataFrame(np.array(cater_list).reshape(df.shape[0],1), columns= ["cate"])
print(cater_df, '\n')

df["cate"] = cater_df

cater_num = df.groupby(by = "cate").count()["title"]
print(cater_num, '\n')

# 把時間字符串轉化爲時間序列
df["timeStamp"] = pd.to_datetime(df["timeStamp"])
# 把時間序列做爲DataFrame的行索引
df.set_index("timeStamp", inplace=True)

# 統計出911數據中不同月份電話次數的和
count_by_moonth = df.resample("M").count()["title"]
print(count_by_moonth, '\n')

_x = count_by_moonth.index
# 格式化時間戳,把時間格式轉化成 年-月-日 的格式
_x = [i.strftime("%Y-%m-%d") for i in _x]
print(_x, '\n')

# 畫圖
plt.figure(figsize=(20,8),dpi=80)

_y = count_by_moonth.values

plt.xticks(range(len(_x)), _x, rotation = 45)

plt.plot(range(len(_x)),_y)

plt.show()

3.重採樣
重採樣:指的是將時間序列從一個頻率轉化爲另一個頻率進行處理的過程,將高頻率數據轉化爲低頻率數據爲降採樣,低頻率轉化爲高頻率爲升採樣
pandas提供了一個resample的方法來幫助我們實現頻率轉化
在這裏插入圖片描述

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.read_csv("E:/py_application/mplt_np_pda/911.csv")
print(df.head(5))
# 把時間字符串轉化成時間類型
df["timeStamp"] = pd.to_datetime(df["timeStamp"])


temp_list = df["title"].str.split(": ").tolist()
cate_list = [i[0] for i in temp_list]
cate_df = pd.DataFrame(np.array(cate_list).reshape(df.shape[0],1),columns=["cate"])
df["cate"] = cate_df
# 把時間字符串轉化爲索引
df.set_index("timeStamp", inplace=True)

plt.figure(figsize=(20, 8), dpi=80)

for group_name, group_data in df.groupby(by="cate"):
    # 統計出911數據中不同月份電話次數的和
    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()
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.read_csv("E:/py_application/mplt_np_pda/PM2.5/BeijingPM20100101_20151231.csv")
print("df.info():\n", df.info(), '\n')
print("df.head(5):\n", df.head(5), '\n')

# 把分開的時間字符串通過periodIndex的方法再轉化爲pandas的時間類型
period = pd.PeriodIndex(year=df["year"], month=df["month"], day=df["day"], freq="H")
print("period:\n", period, '\n')
df["datatime"] = period

# 把datatime設置爲索引
df.set_index("datatime", inplace=True)

# 進行降採樣
df = df.resample("2M").mean()

# 缺失數據的處理
# print("df[\"PM_US Post\"]:\n", df["PM_US Post"], '\n')
data_us = df["PM_US Post"]
data_cn = df["PM_Dongsihuan"]

# 畫圖
_x = data_us.index
_y = data_us.values

plt.figure(figsize=(20, 8), dpi=80)

plt.xticks(range(0, len(_x)), list(_x), rotation=45)

plt.plot(range(len(_x)),_y)
plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章