pandas基础操作1.0

pandas基础操作

一、pandas常用数据类型

1、Series 一维,带标签数组
2、DataFrame,二维,Series容器

二、创建 series

1、Series的创建(直接接受一个数组,默认的index是0开始的序列)
import pandas as pd
import string
t = pd.Series([1,2,3,4])

Out[1]:

0    1
1    2
2    3
3    4
dtype: int64
type(t) #pandas.core.series.Series

In [2]:

pd.Series(np.arange(12),index=list(string.ascii_uppercase[:12]))# 索引index要和数组size一致

Out[2]:

A     0
B     1
C     2
D     3
E     4
F     5
G     6
H     7
I     8
J     9
K    10
L    11
dtype: int64
2、通过字典创建Serise

a = {string.ascii_uppercase[i]:i for i in range(10)}
a
{'A': 0,
 'B': 1,
 'C': 2,
 'D': 3,
 'E': 4,
 'F': 5,
 'G': 6,
 'H': 7,
 'I': 8,
 'J': 9}
pd.Series(a) 
A    0
B    1
C    2
D    3
E    4
F    5
G    6
H    7
I    8
J    9
dtype: int64
3、索引对不上的情况(即出现nan)
pd.Series(a,index=list(string.ascii_uppercase[5:15]))
F    5.0
G    6.0
H    7.0
I    8.0
J    9.0
K    NaN
L    NaN
M    NaN
N    NaN
O    NaN
dtype: float64

三、pandas之Serise切片和索引

t:
A     0
B     1
C     2
D     3
E     4
F     5
G     6
H     7
I     8
J     9
K    10
L    11
dtype: int64
1、切片:直接传入start end 或者步长即可
t[1:4:2]  # 索引1-4,左闭右开,2为步长,参照python的list取值
'''
B    1
D    3
dtype: int64
'''

t[1:3] # 只输入start , end,步长默认1
'''
B    1
C    2
dtype: int64
'''

t[::2] # 只输入步长
'''
A     0
C     2
E     4
G     6
I     8
K    10
dtype: int64
'''

2、索引:一个的时候直接传入序号或者index,多个的时候传如序号或者index的列表
#取一个 
t[1]# 传入序号
t['A'] # 传index
# 取多个
t[[1,2,3]]
t[['A','B','C']]
# 注意:如果取没有的值,会出现nan
t[['A','M']] # M不存在
'''
A    0.0
M    NaN
dtype: float64
'''
3、bool取值
t[t>4]
'''
F     5
G     6
H     7
I     8
J     9
K    10
L    11
dtype: int64
'''
4、获取index
t.index
'''
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'], dtype='object')
'''
for i in t.index:
  print(i)
5、获取values
t.values
'''
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
'''
type(t.values)
#numpy.ndarray
6、总结
#Series对象本质由两个数组构成,一个数组构成对象的键(index,索引),一个数组构成值values
#所以,数组的clip等方法是通用的,但是series的where方法结果与ndarray不同
t.where(t >2) # t将小于2的值变为了nan,而并没有去掉
'''
A     NaN
B     NaN
C     NaN
D     3.0
E     4.0
F     5.0
G     6.0
H     7.0
I     8.0
J     9.0
K    10.0
L    11.0
dtype: float64
'''
t.where(t>3,10) # 将小于3的数变为了10,与ndarray的变化相反
'''
A    10
B    10
C    10
D    10
E     4
F     5
G     6
H     7
I     8
J     9
K    10
L    11
dtype: int64
'''

四、pandas读外部文件

1、pd.read_csv()
df = pd.read_csv("./dogNames2.csv")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTR4L7CB-1584608153878)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313113353181.png)]

2、读SQLpandas.``read_sql(sql, con**,** index_col=None**,** coerce_float=True**,** params=None**,** parse_dates=None**,** columns=None**,** chunksize=None)

四、创建pandas的DataFrame

1、直接传入字典
d1 = {"name":["xiaoming","xiaofan"],"age":[12,13],"tel":[10010,10012]}
pd.DataFrame(d1,index=list("ab"))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzOruUNr-1584608153881)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313151557054.png)]

2、传入数组
pd.DataFrame(np.arange(12).reshape(3,4))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtKMGK5Q-1584608153887)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313152921761.png)]

3、说明

DataFrame对象既有行索引,又有列索引

行索引,表明不同行,横向索引,叫index,0轴,axis=0

列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

五、DataFrame的基础属性

df = pd.DataFrame(np.arange(12).reshape(3,4))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBzKJCDL-1584608153893)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313155715067.png)]

1、df.shap 显示行数,列数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJUSaXgA-1584608153903)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313160000676.png)]

2、df.dtype 列数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl8F7mE1-1584608153906)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313160044666.png)]

3、df.ndim 数据维度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w60ivECt-1584608153908)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313160114454.png)]

4、df.index,行索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHd2urdl-1584608153916)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170454872.png)]

5、df.columns ,列索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-of8xiwa1-1584608153926)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170506014.png)]

6、df.values,对象值,二维ndarray数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qE4jiPne-1584608153937)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170517993.png)]

7、df.head(2),查看头部几行,默认5行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNQWossn-1584608153972)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170529280.png)]

8、df.tail(2),显示末尾几行,默认5行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j2SH1tDy-1584608153983)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170556118.png)]

9、df.info(),相关信息概览:行数,列数,列索引,列非空值个数,列类型,内存占用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mpVuIdH6-1584608153993)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170606514.png)]

10、df.describe(),快速综合统计结果:计数,均值,标准差,最大值,最小值,四分位数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MnYZN4f-1584608153995)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200313170617368.png)]

六、DataFrame的常用方法和索引取值

1、df.sort_values(by=“按什么字段排序”, axis=0,ascending=True)(True为升序排序,False为降序)
2、取行或取列

[]方括号写数字,表示取行,对行进行操作

[]方括号写字符串,表示取列索引,对列进行操作

3、pandas之loc
df = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("qwer"))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhMrSCI0-1584608154009)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316105854664.png)]

1)df.loc通过标签索引行数据

df.loc["q","a"]  
# 0
df.loc["a"]==df.loc["a",:] # 取整行
'''
q    0
w    1
e    2
r    3
Name: a, dtype: int64
'''
df.loc[:,"q"]# 取整列
'''
a    0
b    4
c    8
Name: q, dtype: int64
'''
df.loc[["a","c"]]==df.loc[["a","c"],:]# 同时取多行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8QaqZg3-1584608154019)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316110556306.png)]

# 取多列
df.loc[:,["q","w"]]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VxDkNJpp-1584608154028)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316110649279.png)]

# 同时取多行多列
df.loc[["a","c"],["w","r"]] # 同时取a,c两行和“w”,“r”两行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TM9ULvoy-1584608154034)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316110800538.png)]

# 注意:冒号在loc里面是闭合的,会选中右侧括号里的数据
df.loc["a":"c",["w","r"]]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLHu5Jv4-1584608154040)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316111155255.png)]

# 取w列到r列,a,c行的数值
df.loc[["a","c"],"w":"r"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAEecFKK-1584608154050)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316111533046.png)]

#不可以取从“a”行到“c”行,“w”列到“r”列的数据
df.loc[["a","c"],"w":"r"]

2)df.iloc 通过 位置获取行索引

# 取第一行的数据
df.iloc[1]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gziQB9py-1584608154059)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316112458917.png)]

#取第2行第3个数据
df.iloc[1,2] # 6
# 取2,3列的所有数据
df.iloc[:,[1,2]]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVWmzPRd-1584608154062)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316112852238.png)]

# 取1到3列的所有数据
df.iloc[:,1:3] # 不包括右括号的数值,跟loc不同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6iY3HIT-1584608154072)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316113105908.png)]

# 赋值
df.iloc[1,2]=np.nan # pandas自动转float

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AEch5fOG-1584608154084)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316113352389.png)]

4、pandas之布尔索引

1、查找dogName2.csv文件中的使用次数超过800的狗的名字

df[df["Count_AnimalName"]>800]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEjAcuaP-1584608154095)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316133842949.png)]

查找使用次数大于800,小于1000的狗的名字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-edYwI0K4-1584608154098)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316142808508.png)]

布尔索引的不同条件之间需要括号括起来
  • &表示
  • |表示
5、pandas字符串的方法
df["Row_Labels"].str.lower()
'''
1156       bella
9140         max
2660     charlie
3251        coco
12368      rocky
Name: Row_Labels, dtype: object
'''
pandas.core.series.Series

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLsuwAKh-1584608154100)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316151216576.png)]

6、举例

假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data

df = pd.read_csv(file_path)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkbOgBEk-1584608154101)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316221626777.png)]

df.info()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSK0QXzt-1584608154106)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316221710120.png)]

df["Rating"].mean() # 评分均值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0oX5JVy-1584608154108)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316221841695.png)]

len(set(df["Director"].tolist()))# 导演人数 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVf4lFar-1584608154108)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316221851690.png)]

等价

df["Director"].unique()
len(df["Director"].unique()) #644

查看一共多少演员

actor_list = df["Actors"].str.split(",").tolist()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJLc1QDx-1584608154109)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316222036767.png)]

actors_list = [i for j in actor_list for i in j]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C80AG6BM-1584608154109)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316222132570.png)]

actor_num = len(set(actors_list))  # 2394

# 等价于
len(actors_list)  # 3999
len(actor_list)  # 1000
len(pd.Series(actors_list).unique()) #2394

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4eQRbUJl-1584608154112)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316223343172.png)]

七、pandas缺失数据的处理

1、两种情况

1)一种是空,None等,在pandas是NaN(和np.nan一样)

2)另一种是0,人为使其成为0(处理为0的数据 t[t==t]=np.nan, 并不是每次为0的数据都需要处理,计算平均值等情况,nan是不参与计算的,但是0会)

2、对NaN的处理

数据准备:

t1 = pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz"))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PN92H0X7-1584608154116)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316152959388.png)]

 t1.loc[["b","c"],["w","x"]] = np.nan

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1IjgfEPn-1584608154118)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316153023524.png)]

1)、判断是否为NaN的方法:pd.isnull(df),pd.notnull(df)

pd.isnull(t1)
# 可以看到nan的为True

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tdh6qGiN-1584608154118)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316153301257.png)]

pd.notnull(t1) # nan为False

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfY4tehQ-1584608154119)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316153431540.png)]

# 处理方式1
删除NaN所在的行列dropna(axis=0,how='any',inplace=False)
t1.dropna(axis=0,how='any')# 等同于t1[pd.notnull(t1["w"])]

   w	 x	y	z
a	0.0	1.0	2	3
'''
此时的t1并没有被修改,修改参数inplace=True可原地修改
'''

#处理方式2
填充数据, t.fillna(t.mean()), t.fillna(t.median()), t.fillna(0)

t1.fillna(0)# 填充0,图1
t1.fillna() #填充均值 图2
t1["x"]=t1['x'].fillna(t1["x"].mean())#单独赋值1列 图3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdt2qnno-1584608154123)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316154931148.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Een8YSGE-1584608154124)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316155059534.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8LUolBz-1584608154125)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200316155552001.png)]

八、pandas的数据join,merge,concat,append

数据准备

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OEwkhUI-1584608154127)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317143530898.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNhH6NvC-1584608154134)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317143551113.png)]

1、join:默认情况下他是吧行索引相同的数据合并到一起
t1.join(t2) # 以左t1为准,t2没有C行的数据,以nan填充

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMDq2gR2-1584608154136)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317144257910.png)]

t2.join(t1) # 以右t2为准,t2没有c行,则最后的数据集只有AB两行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARCpMGAX-1584608154137)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317144207395.png)]

2、merge:按照指定的列把数据按照一定的方式合并到一起

数据准备

t1 = pd.DataFrame(np.ones(12).reshape(3,4),index=list("ABC"),columns=list("MNOP"))
t1.iloc[0,2]='a'
t1.iloc[1,2]='b'
t1.iloc[2,2]='c'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgBGYZeE-1584608154137)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317153721225.png)]

t2 = pd.DataFrame(np.zeros(10).reshape(2,5),index=list("AB"),columns=list("VWXYZ"))
t2.loc["A","X"]='c'
t2.loc["B","X"]='d'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3Hzh9W5-1584608154137)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317154048433.png)]

1)默认方式相当于inner,交集

t1.merge(t2,left_on="O",right_on="X")# 默认方式相当于inner,交集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qqbHYTnA-1584608154142)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317154451662.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nC9YIOBy-1584608154144)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317154647028.png)]

2)outer 相当于并集 NaN不全

t1.merge(t2,left_on="O",right_on="X",how="outer")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IejMTOqC-1584608154146)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317155508854.png)]

  1. left 以左表为准,右表没有的用NaN补齐,左表没有的舍去
t1.merge(t2,left_on="O",right_on="X",how="left")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5h5nDuS-1584608154151)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317155927257.png)]

4)right 以右表为准,左表没有的用NaN补齐,右表没有的舍去

3、concat拼接两个dataframe和Series
s1 = pd.Series([1,2,3],index=list("abc"))
s2 = pd.Series([4,5,6],index=list("abc"))
pd.concat([s1,s2])

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUG4KsJk-1584608154154)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170532424.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LufUidxA-1584608154159)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170653747.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpHhjA8e-1584608154161)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170710899.png)]

合并DataFrame

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyfWhlZr-1584608154163)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170806374.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0cs9tlY6-1584608154164)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170828353.png)]

t1.merge(t3,how='outer')# 相当于axis=0,水平方向的叠加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANRRfObr-1584608154169)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317170923820.png)]

pd.concat([t1,t3],axis=1) # 竖直方向的叠加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7lOolg2-1584608154171)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317171116044.png)]

4、append向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加。
t1.append(t3)# 水平方向的叠加,相当于axis=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3T7SAlX-1584608154172)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317171711298.png)]

t1.append(t3,ignore_index=True)# 相当于concat的axis=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUqK9oMk-1584608154173)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200317172641875.png)]

九、pandas之聚合聚合操作

1、分组

grouped = df.groupby(by=“columns_name”)

grouped是一个DataFrameGroupBy对象,是可迭代的

grouped中的每一个元素是一个元组

元组里面是(索引(分组的值),分组之后的DataFrame)

eg:

df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.]})# p1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WBiaYiAq-1584608154179)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318153452129.png)]

grouped = df.groupby(by="Animal")
type(grouped) #pandas.core.groupby.groupby.DataFrameGroupBy
for i in grouped:
    print(i)
    type(i) # tuple

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Ha110Ss-1584608154181)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318153800504.png)]

2、聚合函数
函数名说明
Count分组中非NA值的数量
sum非NA值的和
Mean非NA值的均值
Median非NA值的算数中位数
Std、var无偏(分母为n-1)标准差和方差
Min、max非NA值的最小值和最大值
3、实操

以一份星巴克全球店铺统计数据为例

file_path=..."
df = pd.read_csv(path_file)
df.head(10)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ew3RomRA-1584608154181)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318155441220.png)]

基本信息

df.info()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ko7fb4Ch-1584608154182)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318155559416.png)]

3.1 以国家分组统计
data=country_group = df.groupby("Country").count()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gaxfbsh-1584608154187)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318172058554.png)]

3.2查看中国的数量
data.loc["CN","City"]  #2734
#等价于
num["City"]["CN"] # 2734

3.3 统计中国每个省店铺的情况
china_data = df[df["Country"]=="CN"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wTU9I3E-1584608154188)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318172744001.png)]

grouped = china_data.groupby("State/Province")
grouped.count()["City"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHNFzczi-1584608154190)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318172941085.png)]

# 查看所有城市具体名
china_data.loc[:,"City"].unique()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7VxStHr-1584608154191)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318173621490.png)]

# 不重复的数量
len(china_data.loc[:,"City"].unique()) # 197
3.4 补充

分组后的数据类型是DataFrame还是Series

DataFrame:

grouped = china_data[["Brand"]].groupby(by=[china_data["State/Province"]]).count()

type(grouped) # pandas.core.frame.DataFrame

Series:

grouped = china_data["Brand"].groupby(by=[china_data["State/Province"]]).count()

type(grouped) #pandas.core.series.Series

获取分组之后的某一部分数据:

df.groupby(by=[“Country”,“State/Province”])[“Country”].count()

对某几列数据进行分组:

df[“Country”].groupby(by=[df[“Country”],df[“State/Province”]]).count()

十、索引和复合索引

1、回顾简单的索引操作
#获取index
df.index
#指定index
df.index=["x","y"]
#重新设置index:
df.reindex(list("abc"))
#指定某一列作为index:
df.set_index("Country",drop=False)
#返回index的唯一值:
df.set_index("Country").index.unique()
2、复合索引
a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c': ['one','one','one','two','two','two', 'two'],'d': list("hjklmno")})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtPE4Z8J-1584608154191)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318225059140.png)]

x = a.set_index(["c","d"])["a"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpIH67IQ-1584608154197)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318225357062.png)]

x["one","h"] # 0
#只取索引h对应的值
x.swaplevel() #图1
#leavels是什么
x.index.levels
'''
levels相当于就是复合索引的里外层,交换levels之后,里外交换
FrozenList([['one', 'two'], ['h', 'j', 'k', 'l', 'm', 'n', 'o']])
'''

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgHzrf4F-1584608154198)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318225818107.png)]

3、DataFrame的复合索引
s = a.set_index(["c","d"])[["a"]] # 同样是上面的a,注意最后的[["a"]],决定了数据类型是series 还是DataFrame

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bhRbjHG-1584608154199)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318230609776.png)]

s.loc["one"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rc6KoZvh-1584608154204)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318230917434.png)]

s.loc["one"].loc["h"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mx2iwB12-1584608154205)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318230952397.png)]

s.index
'''
MultiIndex(levels=[['one', 'two'], ['h', 'j', 'k', 'l', 'm', 'n', 'o']],
           labels=[[0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 3, 4, 5, 6]],
           names=['c', 'd'])
'''
s.swaplevel()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ixX485xu-1584608154205)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318231151317.png)]

# 索引
s.swaplevel().loc["h"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-viNXnSKT-1584608154210)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318231311985.png)]

s.swaplevel().loc["h","a"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWJNegSO-1584608154210)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200318231420036.png)]

s.swaplevel().loc["h"].loc["one","a"]  # 0

十一、pandas的时间序列

pandas.``date_range(start=None, end=None**,** periods=None**,** freq=None**,** tz=None**,** normalize=False**,** name=None**,** closed=None**,** kwargs)** **

1、参数说明
1)生成2020年1月到4月的时间序列,频率是月
pd.date_range(start='20200101',end='20200401',freq='M') # 不指定freq的情况下默认是天“D”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u4Cy5tFY-1584608154211)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319111129750.png)]

2)、生成从3月1日开始的,为期8天的时间序列
pd.date_range(start='20200301',periods=7)## 不指定freq的情况下默认是天“D” 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VRNiLsXj-1584608154213)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319111425524.png)]

3)、指定end时间,时间期间periods,默认的freq是天“D”
# 指定end时间,时间期间periods,默认的freq是天“D”
pd.date_range(end='20200401',periods=3)
'''
DatetimeIndex(['2020-03-30', '2020-03-31', '2020-04-01'], dtype='datetime64[ns]', freq='D')
'''
# 指定freq,
pd.date_range(end='20200401',periods=3, freq="M")
'''
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31'], dtype='datetime64[ns]', freq='M')
'''
4)指定start时间,end时间,periods时间,freq在指定了periods的情况下会自动对应
pd.date_range(start='1/1/2020',end='1/4/2020',periods=3) # 时间排布是月/日/年,“202001”
'''
DatetimeIndex(['2020-01-01 00:00:00', '2020-02-15 12:00:00',
               '2020-04-01 00:00:00'],
              dtype='datetime64[ns]', freq=None)
'''
# 不用的时间格式书写可以共存
pd.date_range(start='20200101',end='4/1/2020',periods=3)
pd.date_range(start='20200101',end='2020-4-1',periods=3)
5)频率的更多缩写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z7Ojqd9U-1584608154216)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319142856422.png)]

Alias   Description
B       business day frequency
C       custom business day frequency (experimental)
D       calendar day frequency
W       weekly frequency
M       month end frequency
BM      business month end frequency
CBM     custom business month end frequency
MS      month start frequency
BMS     business month start frequency
CBMS    custom business month start frequency
Q       quarter end frequency
BQ      business quarter endfrequency
QS      quarter start frequency
BQS     business quarter start frequency
A       year end frequency
BA      business year end frequency
AS      year start frequency
BAS     business year start frequency
BH      business hour frequency
H       hourly frequency
T, min  minutely frequency
S       secondly frequency
L, ms   milliseonds
U, us   microseconds
N       nanoseconds 纳秒
6)参数closed
pd.date_range(start='2020-01-01', end='2020-01-04', closed=None)
'''
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04'], dtype='datetime64[ns]', freq='D')
'''
pd.date_range(start='2020-01-01', end='2020-01-04', closed='right') # 包含截止日期,不含开始日期
'''
DatetimeIndex(['2020-01-02', '2020-01-03', '2020-01-04'], dtype='datetime64[ns]', freq='D')
'''
pd.date_range(start='2020-01-01', end='2020-01-04', closed='left')# 包含开始日期,不含截止日期
'''
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')
'''
2、在DataFrame中使用时间序列
index = pd.date_range(start='20200315',periods=7)
df = pd.DataFrame(np.random.rand(7),index=index,columns=["random"])

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exk77KBc-1584608154218)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319152112959.png)]

3、pandas重采样

重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样

方法:pandas.DataFrame.resample()

index = pd.date_range('1/1/2020', periods=9, freq='T')
series = pd.Series(range(9), index=index)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5NIZgf5-1584608154219)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319152418620.png)]

a = series.resample('3T')
type(a)
# pandas.core.resample.DatetimeIndexResampler
a.sum()
'''
2020-01-01 00:00:00     3
2020-01-01 00:03:00    12
2020-01-01 00:06:00    21
Freq: 3T, dtype: int64
'''
type(a.sum())# pandas.core.series.Series
1)降采样的时候,重新划分的bucket储存区默认是按左侧为label的,如果指定为右侧做标记,则bucket中不包含该标记的值,如果想要包含,则需要指定closed=‘right’
series.resample('3T',label='right',closed='right').sum()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOsj2x3C-1584608154225)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319155105463.png)]

2)升采样,将频率freq设置为30S
series.resample('30S').asfreq()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMbjD1Eu-1584608154229)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319160943032.png)]

# 用pad方法填充NaN值
series.resample('30S').pad()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSvnJxLz-1584608154231)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319161059201.png)]

# bfill 方法填充NaN值
series.resample('30S').bfill()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbEMKnfQ-1584608154234)(/Users/bobwang/Library/Application Support/typora-user-images/image-20200319161319108.png)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值