超全的pandas数据分析常用函数总结:下篇(附赠思维导图)

pandas数据分析常用函数总结 | 下篇

  • 5. 数据预处理
        • 5.1 数据的合并
        • 5.2 设置索引列
        • 5.3 按照特定列的值排序:
        • 5.4 分类显示
        • 5.5 分组标记
        • 5.6 切割数据
  • 6. 数据提取
        • 6.1 单行索引
        • 6.2 区域索引
            • 6.2.1 用loc取连续的多行
            • 6.2.2 用loc取不连续的多行
            • 6.2.3 用loc取具体值
            • 6.2.4 用iloc取连续的多行
            • 6.2.5 用iloc取连续的多行和多列
            • 6.2.6 用iloc取不连续的多行和多列
            • 6.2.7 用iloc取具体值
        • 6.3 值的判断
        • 6.4 提取符合判断的值
  • 7. 数据筛选
        • 7.1 使用与、或、非进行筛选
        • 7.2 使用query函数进行筛选
        • 7.3 对结果进行计数求和
  • 8. 数据汇总
        • 8.1 以department属性对所有列进行计数汇总
        • 8.2 以department属性分组之后,对id字段进行计数汇总
        • 8.3 以两个属性进行分组计数
        • 8.4 以department属性进行分组汇总并计算money的合计与均值
  • 9. 数据统计
        • 9.1 数据采样
        • 9.2 描述性统计
        • 9.3 计算标准差
        • 9.4 计算协方差
        • 9.5 相关性分析
  • 思维导图

基础知识在数据分析中就像是九阳神功,熟练的掌握,加以运用,就可以练就深厚的内力,成为绝顶高手自然不在话下!
.
为了更好地学习数据分析,我对于数据分析中pandas这一模块里面常用的函数进行了总结。整篇总结,在详尽且通俗易懂的基础上,我力求使其有很强的条理性和逻辑性,所以制作了思维导图,对于每一个值得深究的函数用法,我也会附上官方链接,方便大家继续深入学习。
.
文章中的所有代码都会有讲解和注释,绝大部分也都会配有运行结果,酱紫的话,整篇总结篇幅量自然不小,所以我分成了上下两篇,这里是下篇。

5. 数据预处理

先创建一个data2数据集

data2=pd.DataFrame({
    "id":np.arange(102,105),
    "profit":[1,10,2]
})
data2

输出结果:

id profit
0 102 1
1 103 10
2 104 2

再创建一个data3数据集

data3=pd.DataFrame({
    "id":np.arange(111,113),
    "money":[106,51]
})
data3

输出结果:

id money
0 111 106
1 112 51

5.1 数据的合并

用merge合并

DataFrame.merge(self,right,how =‘inner’,on = None)

  • right指要合并的对象
  • on指要加入的列或索引级别名称,必须在两个DataFrame中都可以找到。
  • how决定要执行的合并类型:left(使用左框架中的键)、right、inner(交集,默认)、outer(并集)
data_new=pd.merge(data,data2,on='id',how='inner')      # 默认取交集
data_new=pd.merge(data,data2,on='id',how='outer')      # 取并集,没有值的地方填充NaN
data.merge(data2,on='id',how='inner')                  # 另一种写法,输出结果见下方

输出结果:

id date money product department origin profit
0 102 2020-03-11 4.000000 可乐 饮料 China 1
1 103 2020-03-12 65.000000 牛肉干 零食 America 10
2 104 2020-03-13 20.666667 老干妈 调味品 China 2

更多关于pandas.DataFrame.merge的用法,戳下面官方链接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

data.merge(data2,on='id',how='left')     # 使用左框架中的键

输出结果:

id date money product department origin profit
0 101 2020-03-10 5.000000 苏打水 饮料 China NaN
1 102 2020-03-11 4.000000 可乐 饮料 China 1.0
2 103 2020-03-12 65.000000 牛肉干 零食 America 10.0
3 104 2020-03-13 20.666667 老干妈 调味品 China 2.0
4 105 2020-03-14 15.000000 菠萝 水果 Thailand NaN
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China NaN
6 107 2020-03-16 35.000000 洗面奶 日用品 America NaN
7 108 2020-03-17 16.000000 洋葱 蔬菜 China NaN
8 109 2020-03-18 6.000000 牙膏 日用品 China NaN
9 110 2020-03-19 20.000000 薯片 零食 Japan NaN

用append合并

data.append(data2)    # 在原数据集的下方合并入新的数据集

输出结果:

date department id money origin product profit
0 2020-03-10 饮料 101 5.000000 China 苏打水 NaN
1 2020-03-11 饮料 102 4.000000 China 可乐 NaN
2 2020-03-12 零食 103 65.000000 America 牛肉干 NaN
3 2020-03-13 调味品 104 20.666667 China 老干妈 NaN
4 2020-03-14 水果 105 15.000000 Thailand 菠萝 NaN
5 2020-03-15 NaN 106 20.000000 China 冰激凌 NaN
6 2020-03-16 日用品 107 35.000000 America 洗面奶 NaN
7 2020-03-17 蔬菜 108 16.000000 China 洋葱 NaN
8 2020-03-18 日用品 109 6.000000 China 牙膏 NaN
9 2020-03-19 零食 110 20.000000 Japan 薯片 NaN
0 NaN NaN 102 NaN NaN NaN 1.0
1 NaN NaN 103 NaN NaN NaN 10.0
2 NaN NaN 104 NaN NaN NaN 2.0

用join合并
用下面这种方式会报错:列重叠,且没有指定后缀,因为上面的数据data和data2都有“id”列,所以需要给id列指明后缀。

data.join(data2)        # 会报错

第一种修改方式:

data.join(data2,lsuffix='_data', rsuffix='_data2')

输出结果:

id_data date money product department origin id_data2 profit
0 101 2020-03-10 5.000000 苏打水 饮料 China 102.0 1.0
1 102 2020-03-11 4.000000 可乐 饮料 China 103.0 10.0
2 103 2020-03-12 65.000000 牛肉干 零食 America 104.0 2.0
3 104 2020-03-13 20.666667 老干妈 调味品 China NaN NaN
4 105 2020-03-14 15.000000 菠萝 水果 Thailand NaN NaN
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China NaN NaN
6 107 2020-03-16 35.000000 洗面奶 日用品 America NaN NaN
7 108 2020-03-17 16.000000 洋葱 蔬菜 China NaN NaN
8 109 2020-03-18 6.000000 牙膏 日用品 China NaN NaN
9 110 2020-03-19 20.000000 薯片 零食 Japan NaN NaN

第二种修改方式:

data.set_index('id').join(data2.set_index('id'))

输出结果:
超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第1张图片

更多关于pandas.DataFrame.join的用法,戳下面官方链接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html

用concat合并

pandas.concat(objs,axis = 0,ignore_index = False,keys = None)

  • objs:Series,DataFrame或Panel对象的序列或映射。
  • axis:串联的轴,默认为0,即以索引串联(竖直拼接);如果为1,则以列串联(水平拼接)
  • ignore_index:清除现有索引并将其重置,默认为False。
  • key:在数据的最外层添加层次结构索引。
data_new=pd.concat([data,data2,data3],axis = 1,keys=['data', 'data2','data3'])
data_new

输出结果:

超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第2张图片

更多关于pandas.concat的用法,戳下面官方链接:https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.concat.html

5.2 设置索引列

data.set_index("id")      # 设置id为索引列

输出结果:
超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第3张图片

data.reset_index(drop=True)    # 重置索引列,并且避免将旧索引添加为列

输出结果:

id date money product department origin
0 101 2020-03-10 5.000000 苏打水 饮料 China
1 102 2020-03-11 4.000000 可乐 饮料 China
2 103 2020-03-12 65.000000 牛肉干 零食 America
3 104 2020-03-13 20.666667 老干妈 调味品 China
4 105 2020-03-14 15.000000 菠萝 水果 Thailand
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China
6 107 2020-03-16 35.000000 洗面奶 日用品 America
7 108 2020-03-17 16.000000 洋葱 蔬菜 China
8 109 2020-03-18 6.000000 牙膏 日用品 China
9 110 2020-03-19 20.000000 薯片 零食 Japan

5.3 按照特定列的值排序:

按照索引列进行排序:

data.sort_index()            

按照money的值进行排序:

data.sort_values(by="money",ascending = True)    # ascending默认为True,即升序.

输出结果:

id date money product department origin
1 102 2020-03-11 4.000000 可乐 饮料 China
0 101 2020-03-10 5.000000 苏打水 饮料 China
8 109 2020-03-18 6.000000 牙膏 日用品 China
4 105 2020-03-14 15.000000 菠萝 水果 Thailand
7 108 2020-03-17 16.000000 洋葱 蔬菜 China
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China
9 110 2020-03-19 20.000000 薯片 零食 Japan
3 104 2020-03-13 20.666667 老干妈 调味品 China
6 107 2020-03-16 35.000000 洗面奶 日用品 America
2 103 2020-03-12 65.000000 牛肉干 零食 America

5.4 分类显示

如果money列的值>=10, level列显示high,否则显示low:

data['level'] = np.where(data['money']>=10, 'high', 'low')
data

输出结果:

id date money product department origin level
0 101 2020-03-10 5.000000 苏打水 饮料 China low
1 102 2020-03-11 4.000000 可乐 饮料 China low
2 103 2020-03-12 65.000000 牛肉干 零食 America high
3 104 2020-03-13 20.666667 老干妈 调味品 China high
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China high
6 107 2020-03-16 35.000000 洗面奶 日用品 America high
7 108 2020-03-17 16.000000 洋葱 蔬菜 China high
8 109 2020-03-18 6.000000 牙膏 日用品 China low
9 110 2020-03-19 20.000000 薯片 零食 Japan high

5.5 分组标记

data.loc[(data['level']=="high") & (data['origin']=="China"),"sign"]="棒"
data

输出结果:

id date money product department origin level sign
0 101 2020-03-10 5.000000 苏打水 饮料 China low NaN
1 102 2020-03-11 4.000000 可乐 饮料 China low NaN
2 103 2020-03-12 65.000000 牛肉干 零食 America high NaN
3 104 2020-03-13 20.666667 老干妈 调味品 China high
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China high
6 107 2020-03-16 35.000000 洗面奶 日用品 America high NaN
7 108 2020-03-17 16.000000 洋葱 蔬菜 China high
8 109 2020-03-18 6.000000 牙膏 日用品 China low NaN
9 110 2020-03-19 20.000000 薯片 零食 Japan high NaN

5.6 切割数据

对date字段的值依次进行分列,并创建数据表,索引值为data的索引列,列名称为year\month\day。

data_split = pd.DataFrame((x.split('-') for x in data['date']), index=data.index, columns=['year','month','day'])
data_split

输出结果:

year month day
0 2020 03 10
1 2020 03 11
2 2020 03 12
3 2020 03 13
4 2020 03 14
5 2020 03 15
6 2020 03 16
7 2020 03 17
8 2020 03 18
9 2020 03 19

再与原数据表进行匹配:

pd.concat([data,data_split],axis=1)

输出结果:

id date money product department origin level sign year month day
0 101 2020-03-10 5.000000 苏打水 饮料 China low NaN 2020 03 10
1 102 2020-03-11 4.000000 可乐 饮料 China low NaN 2020 03 11
2 103 2020-03-12 65.000000 牛肉干 零食 America high NaN 2020 03 12
3 104 2020-03-13 20.666667 老干妈 调味品 China high 2020 03 13
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN 2020 03 14
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China high 2020 03 15
6 107 2020-03-16 35.000000 洗面奶 日用品 America high NaN 2020 03 16
7 108 2020-03-17 16.000000 洋葱 蔬菜 China high 2020 03 17
8 109 2020-03-18 6.000000 牙膏 日用品 China low NaN 2020 03 18
9 110 2020-03-19 20.000000 薯片 零食 Japan high NaN 2020 03 19

6. 数据提取

下面这部分会比较绕:

loc函数按标签值进行提取,iloc按位置进行提取
pandas.DataFrame.loc() 允许输入的值:

  • 单个标签,例如5或’a’,(请注意,5被解释为索引的标签,而不是沿索引的整数位置)。
  • 标签列表或数组,例如。[‘a’, ‘b’, ‘c’]
  • 具有标签的切片对象,例如’a’:‘f’,切片的开始和结束都包括在内。

更多关于pandas.DataFrame.loc的用法,戳下面官方链接: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc

pandas.DataFrame.iloc()
允许输入的值:整数5、整数列表或数组[4,3,0]、整数的切片对象1:7

更多关于pandas.DataFrame.iloc的用法,戳下面官方链接: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html#pandas.DataFrame.iloc

6.1 单行索引

data.loc[6]    # 提取索引值为6的那一行(即输出第7行)

输出结果:

id 107
date 2020-03-16
money 35
product 洗面奶
department 日用品
origin America
level high
sign NaN
data.iloc[6]    # 提取第7行

输出结果同上!

6.2 区域索引

6.2.1 用loc取连续的多行
  • 提取索引值为2到索引值为4的所有行,即提取第3行到第5行,注意:此时切片的开始和结束都包括在内。
data.loc[2:4] 

输出结果:

id date money product department origin level sign
2 103 2020-03-12 65.000000 牛肉干 零食 America high NaN
3 104 2020-03-13 20.666667 老干妈 调味品 China high
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN
  • 提取“2020-03-13”之前的所有数据
data.loc[:"2020-03-13"]    

输出结果:

id date money product department origin level sign
0 101 2020-03-10 5.0 苏打水 饮料 China low NaN
1 102 2020-03-11 4.0 可乐 饮料 China low NaN
2 103 2020-03-12 65.0 牛肉干 零食 America high NaN
6.2.2 用loc取不连续的多行
  • 提取索引值为2和索引值为4的所有行,即提取第3行和第5行。
data.loc[[2,4]]

输出结果:

id date money product department origin level sign
2 103 2020-03-12 65.0 牛肉干 零食 America high NaN
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN
6.2.3 用loc取具体值
data.loc[6,"id"]

输出结果:107

6.2.4 用iloc取连续的多行
  • 提取第3行到第6行
data.iloc[2:6]

输出结果:

id date money product department origin level sign
2 103 2020-03-12 65.0 牛肉干 零食 America high NaN
3 104 2020-03-13 20.666667 老干妈 调味品 China high
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China high
6.2.5 用iloc取连续的多行和多列
  • 提取第3行到第6行,第4列到第5列的值,取得是行和列交叉点的位置。
data.iloc[2:6,3:5]

输出结果:

product department
2 牛肉干 零食
3 老干妈 调味品
4 菠萝 水果
5 冰激凌 冷冻食品
6.2.6 用iloc取不连续的多行和多列
  • 提取第3行 和 第6行,第4列 和 第5列的交叉值
data.iloc[[2,6],[3,5]]

输出结果:

product origin
2 牛肉干 America
6 洗面奶 America
6.2.7 用iloc取具体值
  • 提取第3行第7列的值
data.iloc[2,6]

输出结果:‘high’

总结:文字变代码,数值少1;代码变文字,数值加1;代码从0开始计数;文字从1开始计数。

6.3 值的判断

方式一:判断origin列的值是否为China

data['origin']=="China"

方式二:判断department列的值是否为水果

data['department'].isin(['水果']) 

输出结果:

0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
9 False
data['department'].isin(['水果']).sum()     # 对判断后的值进行汇总

输出结果:1

6.4 提取符合判断的值

data.loc[data['origin'].isin(['Thailand'])]    # 将产地是泰国的数据进行提取

输出结果:

id date money product department origin level sign
4 105 2020-03-14 15.000000 菠萝 水果 Thailand high NaN

7. 数据筛选

7.1 使用与、或、非进行筛选

  • 将满足origin是China且money小于35这两个条件的数据,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") & (data['money']<35),['id','date','money','product','department','origin']]

输出结果:

id date money product department origin
0 101 2020-03-10 5.000000 苏打水 饮料 China
1 102 2020-03-11 4.000000 可乐 饮料 China
3 104 2020-03-13 20.666667 老干妈 调味品 China
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China
7 108 2020-03-17 16.000000 洋葱 蔬菜 China
8 109 2020-03-18 6.000000 牙膏 日用品 China
  • 将满足origin是China或者money小于35这两个条件之中任意一个条件的数据,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") | (data['money']<35),['id','date','money','product','department','origin']]

输出结果:

id date money product department origin
0 101 2020-03-10 5.000000 苏打水 饮料 China
1 102 2020-03-11 4.000000 可乐 饮料 China
3 104 2020-03-13 20.666667 老干妈 调味品 China
4 105 2020-03-14 15.000000 菠萝 水果 Thailand
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China
7 108 2020-03-17 16.000000 洋葱 蔬菜 China
8 109 2020-03-18 6.000000 牙膏 日用品 China
9 110 2020-03-19 20.000000 薯片 零食 Japan
  • 将满足origin是China且money不小于10这两个条件的数据,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") != (data['money']<10),['id','date','money','product','department','origin']]

输出结果:

id date money product department origin
3 104 2020-03-13 20.666667 老干妈 调味品 China
5 106 2020-03-15 20.000000 冰激凌 冷冻食品 China
7 108 2020-03-17 16.000000 洋葱 蔬菜 China

7.2 使用query函数进行筛选

data.query('department=="饮料"')              # 单个条件筛选
data.query('department==["饮料","零食"]')     # 多个条件筛选

输出结果:

id date money product department origin level sign
0 101 2020-03-10 5.0 苏打水 饮料 China low NaN
1 102 2020-03-11 4.0 可乐 饮料 China low NaN
2 103 2020-03-12 65.0 牛肉干 零食 America high NaN
9 110 2020-03-19 20.0 薯片 零食 Japan high NaN

更多关于pandas.DataFrame.query的用法,戳下面官方链接: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html

7.3 对结果进行计数求和

data.query('department=="饮料"').count()         # 对饮料类型的数据进行筛选后计数
data.query('department=="饮料"').money.count()   # 对筛选后的数据按照money进行计数

输出结果:2

data.query('department=="饮料"').money.sum()    # 在筛选后的数据中,对money进行求和

输出结果:9.0

8. 数据汇总

8.1 以department属性对所有列进行计数汇总

data.groupby("department").count()

输出结果:
超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第4张图片

8.2 以department属性分组之后,对id字段进行计数汇总

data.groupby("department")['id'].count()

输出结果:

冷冻食品 1
日用品 2
水果 1
蔬菜 1
调味品 1
零食 2
饮料 2

8.3 以两个属性进行分组计数

data.groupby(["department","origin"]).count()

输出结果:
超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第5张图片

8.4 以department属性进行分组汇总并计算money的合计与均值

data.groupby("department")['money'].agg([len, np.sum, np.mean])

输出结果:超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第6张图片

9. 数据统计

9.1 数据采样

pandas.DataFrame.sample(n = None,replace = False,weights = None)

  • n:样本数
  • replace:样本有无更换(有无放回)(默认不放回)
  • weights:权重

更多关于pandas.DataFrame.sample的用法,戳下面官方链接: https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

data.sample(3,replace=True,weights=[0.1,0.1,0.2,0.2,0.1,0.1,0.1,0.1,0,0])

输出结果:

id date money product department origin level sign
1 102 2020-03-11 4.000000 可乐 饮料 China low NaN
3 104 2020-03-13 20.666667 老干妈 调味品 China high
0 101 2020-03-10 5.000000 苏打水 饮料 China low NaN

9.2 描述性统计

data.describe().round(2).T      # round表示小数位数,T表示转置(这一函数之前提及过)

9.3 计算标准差

data['money'].std()

输出结果:18.14754345175493

9.4 计算协方差

data.cov()

输出结果:

id money
id 9.166667 -2.666667
money -2.666667 329.333333

9.5 相关性分析

data.corr()

输出结果:

id money
id 1.000000 -0.048534
money -0.048534 1.000000

思维导图

超全的pandas数据分析常用函数总结:下篇(附赠思维导图)_第7张图片
笔记中如果有错误的地方,欢迎各位小伙伴指正,感谢!
如果需要完整思维导图电子版(PDF、Xmind等)可以留言或者私信!

参考资料:

  1. pandas官网
  2. pandas用法总结
  3. Pandas 文本数据方法 capitalize( ) lower( ) upper( )
  4. python【all()全1为1, any()全0为0】
  5. pandas 数据类型转换

你可能感兴趣的:(超全的pandas数据分析常用函数总结:下篇(附赠思维导图))