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)]
- 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)]
转载:https://blog.csdn.net/Bobdragery/article/details/104971245