數(shù)據(jù)分析-3 pandas

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載碗短,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者偎谁。
  • 序言:七十年代末巡雨,一起剝皮案震驚了整個(gè)濱河市铐望,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌督弓,老刑警劉巖愚隧,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录煤,死亡現(xiàn)場(chǎng)離奇詭異荞胡,居然都是意外死亡硝训,警方通過(guò)查閱死者的電腦和手機(jī)窖梁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門纵刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)假哎,“玉大人舵抹,你說(shuō)我怎么就攤上這事惧蛹∠闵ぃ” “怎么了装畅?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵像云,是天一觀的道長(zhǎng)苫费。 經(jīng)常有香客問(wèn)我双抽,道長(zhǎng)牍汹,這世上最難降的妖魔是什么柬泽? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮第煮,結(jié)果婚禮上包警,老公的妹妹穿的比我還像新娘害晦。我一直安慰自己暑中,他們只是感情好鳄逾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布澄者。 她就那樣靜靜地躺著粱挡,像睡著了一般询筏。 火紅的嫁衣襯著肌膚如雪嫌套。 梳的紋絲不亂的頭發(fā)上踱讨,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天痹筛,我揣著相機(jī)與錄音谣旁,去河邊找鬼滋早。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搁进,可吹牛的內(nèi)容都是我干的饼问。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萧吠!你這毒婦竟也來(lái)了桐筏?” 一聲冷哼從身側(cè)響起狰腌,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹莲,沒(méi)想到半個(gè)月后尸诽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲赵,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悲敷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年俭令,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了后德。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抄腔,死狀恐怖瓢湃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赫蛇,我是刑警寧澤绵患,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站悟耘,受9級(jí)特大地震影響落蝙,放射性物質(zhì)發(fā)生泄漏旺嬉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦旷祸、人聲如沸闰围。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逝她,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酗宋,已是汗流浹背哎迄。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工旨涝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩耐,地道東北人消别。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓蛇券,卻偏偏與公主長(zhǎng)得像蒂胞,于是被迫代替她去往敵國(guó)和親鸿染。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容