numpy能夠幫我們處理處理數(shù)值型數(shù)據(jù),但是這還不夠
很多時(shí)候腔长,我們的數(shù)據(jù)除了數(shù)值之外袭祟,還有字符串,還有時(shí)間序列等捞附。比如:?jiǎn)渭?xì)胞測(cè)序的結(jié)果中除了數(shù)值之外還有樣本信息碳蛋、基因信息等士袄。所以她肯,numpy能夠幫助我們處理數(shù)值了牛,但是pandas除了處理數(shù)值之外(基于numpy)压状,還能夠幫助我們處理其他類型的數(shù)據(jù)何缓。
pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.
pandas的常用數(shù)據(jù)類型:
1.Series 一維传轰,帶標(biāo)簽數(shù)組
2.DataFrame 二維辽聊,Series容器
1. Series和外部數(shù)據(jù)讀取
Series對(duì)象本質(zhì)上由兩個(gè)數(shù)組
構(gòu)成跟匆。一個(gè)數(shù)組構(gòu)成對(duì)象的鍵(index
玛臂,索引),一個(gè)數(shù)組構(gòu)成對(duì)象的值(values
)虎忌,鍵-->值堪藐。
- 創(chuàng)建Series(可以通過(guò)傳入列表或字典來(lái)創(chuàng)建。當(dāng)傳入字典時(shí)糖荒,字典的鍵就是生成的Series的索引)
import pandas as pd
t1=pd.Series([1,2,31,12,3,4])
print(t1) #得到帶標(biāo)簽的索引
# 0 1
# 1 2
# 2 31
# 3 12
# 4 3
# 5 4
# dtype: int64
print(type(t1))
# <class 'pandas.core.series.Series'>
t2=pd.Series([1,2,3,5],index=list('abcd')) #手動(dòng)設(shè)定索引
print(t2)
# a 1
# b 2
# c 3
# d 5
# dtype: int64
#通過(guò)字典來(lái)創(chuàng)建 其中的索引就是字典的鍵
temp_dict={'name':'ahui','age':24,'tel':1001}
t3=pd.Series(temp_dict)
print(t3)
# name ahui
# age 24
# tel 1001
# dtype: object
Series的dtype修改方式和numpy相同
對(duì)于一個(gè)陌生的series類型,我們?nèi)绾沃浪乃饕途唧w的值呢泉孩?
temp_dict={'name':'ahui','age':24,'tel':1001}
t3=pd.Series(temp_dict)
print(t3.index)
#Index(['name', 'age', 'tel'], dtype='object')
print(t3.values)
# ['ahui' 24 1001]
for i in t3.index:
print(i)
# name
# age
# tel
- Series的切片和索引
切片:直接傳入start end或者步長(zhǎng)即可
索引:一個(gè)的時(shí)候直接傳入序號(hào)或者index寓搬,多個(gè)的時(shí)候傳入序號(hào)或者index的列表
import pandas as pd
temp_dict={'name':'ahui','age':24,'tel':1001}
t3=pd.Series(temp_dict)
print(t3)
# name ahui
# age 24
# tel 1001
# dtype: object
print(t3['age']) #通過(guò)索引來(lái)取
#24
print(t3[0])#通過(guò)位置(下標(biāo))來(lái)取
#ahui
print(t3[:2]) #取連續(xù)的值
# name ahui
# age 24
# dtype: object
print(t3[[0,2]]) #取不連續(xù)的值
# name ahui
# tel 1001
# dtype: object
#布爾索引
import pandas as pd
t1=pd.Series([1,2,31,12,3,4])
# print(t1[t1>10])
# 2 31
# 3 12
# dtype: int64
ndarray的很多方法都可以運(yùn)用于series類型,比如argmax唾琼、clip等锡溯。
注意:series的where方法與ndarray不同(其他幾乎都一樣)
- 讀取外部數(shù)據(jù)
import pandas as pd
#pandas讀取 csv
df=pd.read_csv('../dogNames2.csv')
print(df)
2. dataframe
- 創(chuàng)建dataframe
import pandas as pd
import numpy as np
t1=pd.DataFrame(np.arange(12).reshape(3,4))
print(t1)
# 0 1 2 3 #列索引
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
#通過(guò)字典創(chuàng)建
d2={'name':['xm','xh'],'age':[10,11],'tel':[1011,1001]}
t2=pd.DataFrame(d2)
print(t2)
# name age tel
# 0 xm 10 1011
# 1 xh 11 1001
d3=[{'name':'xm','age':10,'tel':1011},{'name':'ej','age':8},{'name':'xm','tel':1051}]
t3=pd.DataFrame(d3)
print(t3)
# name age tel
# 0 xm 10.0 1011.0
# 1 ej 8.0 NaN
# 2 xm NaN 1051.0
DataFrame對(duì)象既有行索引,又有列索引
行索引倡蝙,表明不同行寺鸥,橫向索引,叫index谆奥,0軸宰译,axis=0
列索引沿侈,表名不同列咳短,縱向索引咙好,叫columns勾效,1軸层宫,axis=1
#創(chuàng)建的時(shí)候設(shè)定索引
t4=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('lmno'))
print(t4)
# l m n o
# a 0 1 2 3
# b 4 5 6 7
# c 8 9 10 11
- DataFrame的基本屬性和方法
import pandas as pd
d3=[{'name':'xm','age':10,'tel':1011},{'name':'ej','age':8},{'name':'xm','tel':1051}]
t3=pd.DataFrame(d3)
print(t3)
# name age tel
# 0 xm 10.0 1011.0
# 1 ej 8.0 NaN
# 2 xm NaN 1051.0
print(t3.index)
#RangeIndex(start=0, stop=3, step=1)
print(t3.columns)
# Index(['name', 'age', 'tel'], dtype='object')
print(t3.shape)
#(3, 3)
print(t3.dtypes)
# name object
# age float64
# tel float64
# dtype: object
print(t3.ndim) #查看有幾個(gè)維度
#2
print(t3.head(1))
# name age tel
# 0 xm 10.0 1011.0
print(t3.tail(1))
# name age tel
# 2 xm NaN 1051.0
print(t3.info()) #展示t3的概覽
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 name 3 non-null object
# 1 age 2 non-null float64
# 2 tel 2 non-null float64
# dtypes: float64(2), object(1)
# memory usage: 200.0+ bytes
# None
print(t3.describe()) #快速統(tǒng)計(jì)dataframe中數(shù)值屬性的列
# age tel
# count 2.000000 2.000000
# mean 9.000000 1031.000000
# std 1.414214 28.284271
# min 8.000000 1011.000000
# 25% 8.500000 1021.000000
# 50% 9.000000 1031.000000
# 75% 9.500000 1041.000000
# max 10.000000 1051.000000
按照某一列來(lái)進(jìn)行排序:df.sort_values(by="某一列",ascending=False)
- 索引
1)通過(guò)方括號(hào)來(lái)取
方括號(hào)里寫數(shù)字哮奇,表示取行,對(duì)行進(jìn)行操作
方括號(hào)里寫字符串辩涝,表示取列索引怔揩,對(duì)列進(jìn)行操作
import pandas as pd
df=pd.read_csv('../dogNames2.csv')
#取行或取列
print(df[:20])
print(df['Row_Labels'])
2)pandas之loc
df.loc通過(guò)標(biāo)簽索引行數(shù)據(jù)
import pandas as pd
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','Z'])
#3
print(type(t3.loc['a','Z']))
#<class 'numpy.int64'>
print(t3.loc['a']) #取整行
# W 0
# X 1
# Y 2
# Z 3
# Name: a, dtype: int64
print(t3.loc[['a','c'],:]) #取多行多列
# W X Y Z
# a 0 1 2 3
# c 8 9 10 11
print(t3.loc[['a'],'W':'Y']) #??冒號(hào)在loc里是閉合的,即會(huì)選擇到冒號(hào)后面的數(shù)據(jù)
# W X Y
# a 0 1 2
3)pandas之iloc
df.iloc通過(guò)位置獲取行數(shù)據(jù)
import pandas as pd
import numpy as np
t3=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))
print(t3)
# W X Y Z
# a 0 1 2 3
# b 4 5 6 7
# c 8 9 10 11
print(t3.iloc[1,:])
# W 4
# X 5
# Y 6
# Z 7
# Name: b, dtype: int64
print(t3.iloc[:,2])
# a 2
# b 6
# c 10
# Name: Y, dtype: int64
print(t3.iloc[:,[2,1]])
# Y X
# a 2 1
# b 6 5
# c 10 9
print(t3.iloc[[0,2],[2,1]])
# Y X
# a 2 1
# c 10 9
print(t3.iloc[1:,:2])
# W X
# b 4 5
# c 8 9
t3.iloc[1:,:2]=30 #賦值
print(t3)
# W X Y Z
# a 0 1 2 3
# b 30 30 6 7
# c 30 30 10 11
t3.iloc[1:,:2]=np.nan #不需要轉(zhuǎn)化成浮點(diǎn)型
print(t3)
# W X Y Z
# a 0.0 1.0 2 3
# b NaN NaN 6 7
# c NaN NaN 10 11
4)pandas之布爾索引
&:且
|:或
import pandas as pd
import numpy as np
t4=pd.DataFrame(np.arange(24).reshape(4,6),index=list('abcd'),columns=list('UVWXYZ'))
print(t4)
# U V W X Y Z
# a 0 1 2 3 4 5
# b 6 7 8 9 10 11
# c 12 13 14 15 16 17
# d 18 19 20 21 22 23
print(t4[(t4['W']>5)&(t4['Y']>10)])
# U V W X Y Z
# c 12 13 14 15 16 17
# d 18 19 20 21 22 23
print(t4[(t4['W']>5)|(t4['Y']>10)])
# U V W X Y Z
# b 6 7 8 9 10 11
# c 12 13 14 15 16 17
# d 18 19 20 21 22 23
- 缺失值的處理
判斷數(shù)據(jù)是否為NaN:pd.isnull(df),pd.notnull(df)
處理方式1:刪除NaN所在的行列dropna (axis=0, how='any', inplace=False)
處理方式2:填充數(shù)據(jù),t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
處理為0的數(shù)據(jù):t[t==0]=np.nan #只有0代表數(shù)據(jù)缺失時(shí)需要這樣做
當(dāng)然并不是每次為0的數(shù)據(jù)都需要處理
計(jì)算平均值等情況实幕,nan是不參與計(jì)算的昆庇,但是0會(huì)
import pandas as pd
import numpy as np
t3=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))
t3.iloc[1:,:2]=np.nan
print(t3)
# W X Y Z
# a 0.0 1.0 2 3
# b NaN NaN 6 7
# c NaN NaN 10 11
print(pd.isnull(t3))
# W X Y Z
# a False False False False
# b True True False False
# c True True False False
print(pd.notnull(t3))
# W X Y Z
# a True True True True
# b False False True True
# c False False True True
print(t3[pd.notnull(t3['W'])]) #選取W這一行不為nan的行
# W X Y Z
# a 0.0 1.0 2 3
#處理方式1:dropna刪除
print(t3.dropna(axis=0)) #axis=0表示刪除行
# W X Y Z
# a 0.0 1.0 2 3
print(t3.dropna(axis=1)) #刪除列
# Y Z
# a 2 3
# b 6 7
# c 10 11
print(t3.dropna(axis=0,how='all')) #一行全部是na值才刪除拱撵,否則不刪拴测。這個(gè)參數(shù)默認(rèn)是any昼扛,只要有na值就會(huì)刪除
# W X Y Z
# a 0.0 1.0 2 3
# b NaN NaN 6 7
# c NaN NaN 10 11
#print(t3.dropna(axis=0,how='any',inplace=True)) #inplace默認(rèn)是False抄谐,設(shè)置為True時(shí)會(huì)對(duì)dataframe進(jìn)行原地修改
#處理方式2:fillna替換
print(t3.fillna(0)) #用0替換
# W X Y Z
# a 0.0 1.0 2 3
# b 0.0 0.0 6 7
# c 0.0 0.0 10 11
print(t3.fillna(t3.mean())) #也可以用inplace設(shè)置是否原地修改
# W X Y Z
# a 0.0 1.0 2 3
# b 0.0 1.0 6 7
# c 0.0 1.0 10 11
??pandas之字符串方法
練習(xí):現(xiàn)在假設(shè)我們有一個(gè)組關(guān)于狗的名字的統(tǒng)計(jì)數(shù)據(jù)。(數(shù)據(jù)來(lái)源:https://www.kaggle.com/new-york-city/nyc-dog-names/data)
問(wèn)題1:查看使用次數(shù)最高的前幾個(gè)名字df.sort_values(by="Count_AnimalName",ascending=False)
問(wèn)題2:假如我們想找到所有的使用次數(shù)超過(guò)70的狗的名字/超過(guò)70且不超過(guò)90的狗的名字/超過(guò)70且名字字符串長(zhǎng)度大于4的狗的名字浦箱,應(yīng)該怎么選擇酷窥?
#問(wèn)題1
import pandas as pd
df=pd.read_csv('../dogNames2.csv')
#dataframe中排序的方法
df=df.sort_values(by="Count_AnimalName",ascending=False)
print(df.head(10))
#問(wèn)題2
#大于70的
print(df[df["Count_AnimalName"]>70])
#大于70 小于90的 ??要使用&而不是and,否則會(huì)報(bào)錯(cuò)
print(df[(df["Count_AnimalName"]>70)&(df["Count_AnimalName"]<90)])
#大于70且名字字符串長(zhǎng)度大于4的
print(df[(df["Row_Labels"].str.len()>4)&(df["Count_AnimalName"]>70)])
3. 統(tǒng)計(jì)方法和字符串離散化
- 統(tǒng)計(jì)方法
統(tǒng)計(jì)方法 | 描述 |
---|---|
count | 非NA值的數(shù)量 |
describe | 針對(duì)Series或DF的列計(jì)算匯總統(tǒng)計(jì) |
min,max | 最小值和最大值 |
argmin,argmax | 最小值和最大值的索引位置(整數(shù)) |
idxmin,idxmax | 最小值和最大值的索引值 |
quantile | 樣本分位數(shù)(0到1) |
sum | 求和 |
mean | 均值 |
median | 中位數(shù) |
mad | 根據(jù)均值計(jì)算平均絕對(duì)離差 |
var | 方差 |
std | 標(biāo)準(zhǔn)差 |
skew | 樣本值的偏度(三階矩) |
kurt | 樣本值的峰度(四階矩) |
cumsum | 樣本值的累計(jì)和 |
cummin,cummax | 樣本值的累計(jì)最大值和累計(jì)最小值 |
cumprod | 樣本值的累計(jì)積 |
diff | 計(jì)算一階差分(對(duì)時(shí)間序列很有用) |
pct_change | 計(jì)算百分?jǐn)?shù)變化 |
練習(xí):假設(shè)現(xiàn)在我們有一組從2006年到2016年1000部最流行的電影數(shù)據(jù)沸伏,我們想知道這些電影數(shù)據(jù)中評(píng)分的平均分,導(dǎo)演的人數(shù)澜公,演員的人數(shù)等信息蜕青,我們應(yīng)該怎么獲扔液恕贺喝?對(duì)于這一組電影數(shù)據(jù)氮采,如果我們想獲取rating鹊漠,runtime的分布情況躯概,應(yīng)該如何呈現(xiàn)數(shù)據(jù)娶靡?
數(shù)據(jù)來(lái)源:https://www.kaggle.com/damianpanek/sunday-eda/data
import pandas as pd
import numpy as np
file_path="../IMDB-Movie-Data的副本.csv"
df=pd.read_csv(file_path)
#查看矩陣基本信息
#print(df.info())
#獲取電影數(shù)據(jù)中評(píng)分的均值
print(df['Rating'].mean())
#6.723199999999999
#獲取導(dǎo)演的人數(shù)
print(len(set(df['Director'])))
print(len(df['Director'].unique()))
#644
#獲取所有演員的人數(shù) 演員是用逗號(hào)隔開的
temp_actors_list=df['Actors'].str.split('姿锭,').tolist() #tolist()生成的是大列表,里面每個(gè)小列表內(nèi)才是多個(gè)演員的名字
actors_list=np.array(temp_actors_list).flatten() #二維變一維
#actors_list=[i for j in temp_actors_list for i in j] #和上一行代碼等價(jià)
actors_num=len(set(actors_list))
print(actors_num)
#996
# 獲取rating焚鲜,runtime的分布情況
# 選擇圖形,直方圖
#準(zhǔn)備數(shù)據(jù)
runtime_data=df["Runtime (Minutes)"].values
#畫圖也可以直接用Series犀斋,這里用Values應(yīng)該是為了方便切片叽粹。直接用series切片要用iloc虫几,不然直接切片會(huì)根據(jù)index值進(jìn)行辆脸。比如排序后想更改第一個(gè)值状囱,不用values也不用iloc會(huì)改變index的值而不是排序后的第一個(gè)
max_runtime=runtime_data.max()
min_runtime=runtime_data.min()
num_bin=(max_runtime-min_runtime)//5
plt.figure(figsize=(20,8),dpi=80)
plt.hist(runtime_data,num_bin)
plt.xticks(range(min_runtime,max_runtime+5,5))
plt.show()
#畫rating時(shí)只需把上述代碼runtime_data后面換成‘Rating’亭枷,再 調(diào)整一下步長(zhǎng)即可叨粘。
- 字符串離散化
思考:對(duì)于這一組電影數(shù)據(jù)升敲,如果我們希望統(tǒng)計(jì)電影分類(genre)的情況冻晤,應(yīng)該如何處理數(shù)據(jù)鼻弧?
??思路:重新構(gòu)造一個(gè)全為0的數(shù)組,列名為分類码俩,如果某一條數(shù)據(jù)中分類出現(xiàn)過(guò)笨篷,就讓0變?yōu)?
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.info())
#統(tǒng)計(jì)分類的列表
temp_list=df['Genre'].str.split(',').tolist() #列表嵌套列表的大列表率翅,??在Series里冕臭,用tolist和todict辜贵。在dataframe用to_list和to_dict
genre_list=list(set([i for j in temp_list for i in j])) #用flattern也可以
#構(gòu)建全為0的數(shù)組
zeros_df=pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
# print(zeros_df)
#給每個(gè)電影出現(xiàn)的位置賦值為1
for i in range(df.shape[0]):
zeros_df.loc[i, temp_list[i]]=1
#統(tǒng)計(jì)每個(gè)分類的電影數(shù)量和
genre_count=zeros_df.sum(axis=0)
#排序
genre_count=genre_count.sort_values()
print(genre_count)
#繪圖
plt.figure(figsize=(20,8),dpi=80)
_x=genre_count.index
_y=genre_count.values
plt.bar(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x)
plt.show()
4. 數(shù)據(jù)的合并和分組聚合
- 數(shù)據(jù)的合并
1)join:默認(rèn)情況下是把行索引相同的數(shù)據(jù)合并到一起
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
print(df1)
# a b c d
# A 1.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0
df2=pd.DataFrame(np.ones((3,3)),index=['A','B','C'],columns=list('xyz'))
print(df2)
# x y z
# A 1.0 1.0 1.0
# B 1.0 1.0 1.0
# C 1.0 1.0 1.0
print(df1.join(df2))
# a b c d x y z
# A 1.0 1.0 1.0 1.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0 1.0 1.0 1.0
print(df2.join(df1))
# x y z a b c d
# A 1.0 1.0 1.0 1.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0 1.0 1.0 1.0
# C 1.0 1.0 1.0 NaN NaN NaN NaN
2)merge:按照指定的列把數(shù)據(jù)按照一定的方式合并到一起
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
print(df1)
# a b c d
# A 1.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0
df2=pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('fax'))
print(df2)
# f a x
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
#默認(rèn)取交集 參數(shù)how='inner
df3=df1.merge(df2)
print(df3)
# a b c d f x
# 0 1.0 1.0 1.0 1.0 0 2
# 1 1.0 1.0 1.0 1.0 0 2
df3=df1.merge(df2,on='a') #on等于按照什么進(jìn)行合并
print(df3)
# a b c d f x
#0 1.0 1.0 1.0 1.0 0 2
#1 1.0 1.0 1.0 1.0 0 2
df1.loc['A','a']=100
df3=df1.merge(df2,on='a')
# print(df3)
# a b c d f x
# 0 1.0 1.0 1.0 1.0 0 2
#外連接
df4=df1.merge(df2,on='a',how='outer') #一個(gè)有另一個(gè)沒(méi)有的用NAN補(bǔ)齊
print(df4)
# a b c d f x
# 0 100.0 1.0 1.0 1.0 NaN NaN
# 1 1.0 1.0 1.0 1.0 0 2
# 2 4.0 NaN NaN NaN 3 5
# 3 7.0 NaN NaN NaN 6 8
#左連接
df5=df1.merge(df2,on='a',how='left') #以左邊的df為準(zhǔn),也就是df1
print(df5)
# a b c d f x
# 0 100.0 1.0 1.0 1.0 NaN NaN
# 1 1.0 1.0 1.0 1.0 0.0 2.0
#右連接
df6=df1.merge(df2,on='a',how='right') #以右邊的df為準(zhǔn)嗡靡,也就是df2
print(df6)
# a b c d f x
# 0 1.0 1.0 1.0 1.0 0 2
# 1 4.0 NaN NaN NaN 3 5
# 2 7.0 NaN NaN NaN 6 8
- 分組和聚合
分組:
grouped = df.groupby(by="columns_name")
grouped是一個(gè)DataFrameGroupBy對(duì)象讨彼,是可迭代的
grouped中的每一個(gè)元素是一個(gè)元組
元組里面是(索引(分組的值),分組之后的DataFrame)
聚合:
思考:現(xiàn)在我們有一組關(guān)于全球星巴克店鋪的統(tǒng)計(jì)數(shù)據(jù)蜜自,如果我想知道美國(guó)的星巴克數(shù)量和中國(guó)的哪個(gè)多重荠,或者我想知道中國(guó)每個(gè)省份星巴克的數(shù)量的情況戈鲁,應(yīng)該怎么做婆殿?如果我們需要對(duì)國(guó)家和省份進(jìn)行分組統(tǒng)計(jì)婆芦,應(yīng)該怎么操作消约?(數(shù)據(jù)來(lái)源:https://www.kaggle.com/starbucks/store-locations/data)
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)
#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f80932d5dc0>
#DataFrameGroupby是一個(gè)元祖,元組第一個(gè)值按照xx進(jìn)行分組的那個(gè)值集侯。比如按國(guó)家分組棠枉,第一個(gè)值就是國(guó)家。第二個(gè)值為第一個(gè)值所對(duì)應(yīng)的列表命浴。DataFrameGroupby可以進(jìn)行遍歷生闲,可以調(diào)用聚合方法
#調(diào)用聚合方法
print(grouped.count()) #對(duì)datafame里的所有列都進(jìn)行了count
country_count=grouped["Brand"].count() #除了brand碍讯,別的也可以捉兴,只要沒(méi)有缺失值
print(country_count['US'])
# 13608
print(country_count['CN'])
# 2734
#統(tǒng)計(jì)中國(guó)每個(gè)省份星巴克的數(shù)量
china_data=df[df['Country']=='CN']
grouped=china_data.groupby(by='State/Province').count()['Brand']
print(grouped)
#對(duì)國(guó)家和省份進(jìn)行分組統(tǒng)計(jì)
#數(shù)據(jù)按照多個(gè)條件進(jìn)行分組倍啥,返回Series虽缕。(by=后面不僅可以跟字符串,還可以跟列表)
grouped=df['Brand'].groupby(by=[df['Country'],df['State/Province']]).count()
print(grouped) #得到帶有兩個(gè)索引的Series(因?yàn)槭前凑諆蓚€(gè)條件來(lái)分組的)
#數(shù)據(jù)按照多個(gè)條件進(jìn)行分組弟塞,返回DataFrame
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']]
print(grouped1,type(grouped1))
??一個(gè)[]取series摧冀,兩個(gè)[[]]取dataframe
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
print(df1)
# a b c d
# A 1.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0
print(df1['c'])
print(type(df1['c']))
# A 1.0
# B 1.0
# Name: c, dtype: float64
# <class 'pandas.core.series.Series'>
print(df1[['c']])
print(type(df1[['c']]))
# c
# A 1.0
# B 1.0
# <class 'pandas.core.frame.DataFrame'>
print(df1[['b','c']])
print(type(df1[['b','c']]))
# b c
# A 1.0 1.0
# B 1.0 1.0
# <class 'pandas.core.frame.DataFrame'>
- 索引
簡(jiǎn)單的索引操作:
獲取index:df.index
指定index :df.index = ['x','y']
重新設(shè)置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
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
df1.loc['A','a']=100
print(df1)
# a b c d
# A 100.0 1.0 1.0 1.0
# B 1.0 1.0 1.0 1.0
print(df1.index)
#Index(['A', 'B'], dtype='object')
#索引賦值
df1.index=['a','b']
print(df1)
# a b c d
# a 100.0 1.0 1.0 1.0
# b 1.0 1.0 1.0 1.0
print(df1.index)
# Index(['a', 'b'], dtype='object')
print(df1.reindex(['a','f']))
# a b c d
# a 100.0 1.0 1.0 1.0
# f NaN NaN NaN NaN
#把某一列設(shè)置為索引
print(df1.set_index('a'))
# b c d
# a
# 100.0 1.0 1.0 1.0
# 1.0 1.0 1.0 1.0
print(df1.set_index('b',drop=False)) #索引可以是一致的
# a b c d
# b
# 1.0 100.0 1.0 1.0 1.0
# 1.0 1.0 1.0 1.0 1.0
#返回唯一值
print(df1['d'].unique())
#[1.]
復(fù)合索引:
print(df1.set_index(['b','a']))
# c d
# b a
# 1.0 100.0 1.0 1.0
# 1.0 1.0 1.0
print(df1.set_index(['a','b']).index)
# MultiIndex([(100.0, 1.0),
# ( 1.0, 1.0)],
# names=['a', 'b'])
a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c': ['one','one','one','two','two','two', 'two'],'d': list("hjklmno")})
print(a)
# a b c d
# 0 0 7 one h
# 1 1 6 one j
# 2 2 5 one k
# 3 3 4 two l
# 4 4 3 two m
# 5 5 2 two n
# 6 6 1 two o
b=a.set_index(['c','d'])
print(b)
# a b
# c d
# one h 0 7
# j 1 6
# k 2 5
# two l 3 4
# m 4 3
# n 5 2
# o 6 1
c=b['a']
print(c) #得到有兩個(gè)索引的series
# c d
# one h 0
# j 1
# k 2
# two l 3
# m 4
# n 5
# o 6
# Name: a, dtype: int64
d=c.swaplevel()
print(d)
# d c
# h one 0
# j one 1
# k one 2
# l two 3
# m two 4
# n two 5
# o two 6
# Name: a, dtype: int64
print(c['one']['j'])
# 1
print(b.loc['one'].loc['h'])
# a 0
# b 7
# Name: h, dtype: int64
#dataframe和series的區(qū)別在于索引的時(shí)候如果按標(biāo)簽來(lái)取需要加上loc扩借,否則方括號(hào)內(nèi)的內(nèi)容會(huì)被認(rèn)為是列
練習(xí)1:
使用matplotlib呈現(xiàn)出店鋪總數(shù)排名前10的國(guó)家
使用matplotlib呈現(xiàn)出每個(gè)中國(guó)每個(gè)城市的店鋪數(shù)量
import pandas as pd
import numpy as np
from matplotlib import font_manager
from matplotlib import pyplot as plt
my_font=font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc") #更改字體
file_path="../starbucks_store_worldwide的副本.csv"
df=pd.read_csv(file_path)
print(df.info())
# 使用matplotlib呈現(xiàn)出店鋪總數(shù)排名前10的國(guó)家
#準(zhǔn)備數(shù)據(jù)
data1=df.groupby(by='Country').count()['Brand'].sort_values(ascending=False)[:10]
print(data1)
_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()
#使用matplotlib呈現(xiàn)出每個(gè)中國(guó)每個(gè)城市的店鋪數(shù)量 畫了top25
df=pd.read_csv(file_path)
df=df[df['Country']=='CN']
data1=df.groupby(by='City').count()['Brand'].sort_values(ascending=False)[:25]
_x=data1.index
_y=data1.values
# 繪圖
plt.figure(figsize=(20,12),dpi=80)
plt.barh(range(len(_x)),_y,height=0.3,color='orange')
plt.yticks(range(len(_x)),_x,fontproperties=my_font)
plt.show()
練習(xí)2:
現(xiàn)在我們有全球排名靠前的10000本書的數(shù)據(jù)领斥,那么請(qǐng)統(tǒng)計(jì)一下下面幾個(gè)問(wèn)題:1. 不同年份書的數(shù)量沃暗;2. 不同年份書的平均評(píng)分情況孽锥;
(數(shù)據(jù)來(lái)源:https://www.kaggle.com/zygmunt/goodbooks-10k)
import pandas as pd
import numpy as np
from matplotlib import font_manager
from matplotlib import pyplot as plt
file_path="../books的副本.csv"
df=pd.read_csv(file_path)
print(df.info())
print(df['original_publication_year'])
#刪除年份中缺失值的行
data1=df[pd.notnull(df['original_publication_year'])]
#不同年份書的數(shù)量
grouped=data1.groupby(by='original_publication_year').count()['title']
print(grouped)
#不同年份書的平均評(píng)分情況
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),rotation=45)
plt.show()
5. 時(shí)間序列
問(wèn)題. 現(xiàn)在我們有2015到2017年25萬(wàn)條911的緊急電話的數(shù)據(jù)唬涧,請(qǐng)統(tǒng)計(jì)出出這些數(shù)據(jù)中不同類型的緊急情況的次數(shù)碎节,如果我們還想統(tǒng)計(jì)出不同月份不同類型緊急電話的次數(shù)的變化情況抵卫,應(yīng)該怎么做呢陌僵?(數(shù)據(jù)來(lái)源:https://www.kaggle.com/mchirico/montcoalert/data)