基础知识在数据分析中就像是九阳神功,熟练的掌握,加以运用,就可以练就深厚的内力,成为绝顶高手自然不在话下!
.
为了更好地学习数据分析,我对于数据分析中pandas这一模块里面常用的函数进行了总结。整篇总结,在详尽且通俗易懂的基础上,我力求使其有很强的条理性和逻辑性,所以制作了思维导图,对于每一个值得深究的函数用法,我也会附上官方链接,方便大家继续深入学习。
.
文章中的所有代码都会有讲解和注释,绝大部分也都会配有运行结果,酱紫的话,整篇总结篇幅量自然不小,所以我分成了上下两篇,这里是下篇。
先创建一个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 |
用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.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.concat的用法,戳下面官方链接:https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.concat.html
data.set_index("id") # 设置id为索引列
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 |
按照索引列进行排序:
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 |
如果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 |
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 |
对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 |
下面这部分会比较绕:
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
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行
输出结果同上!
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 |
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 |
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 |
data.loc[6,"id"]
输出结果:107
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 | 棒 |
data.iloc[2:6,3:5]
输出结果:
product | department | |
---|---|---|
2 | 牛肉干 | 零食 |
3 | 老干妈 | 调味品 |
4 | 菠萝 | 水果 |
5 | 冰激凌 | 冷冻食品 |
data.iloc[[2,6],[3,5]]
输出结果:
product | origin | |
---|---|---|
2 | 牛肉干 | America |
6 | 洗面奶 | America |
data.iloc[2,6]
输出结果:‘high’
总结:文字变代码,数值少1;代码变文字,数值加1;代码从0开始计数;文字从1开始计数。
方式一:判断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
data.loc[data['origin'].isin(['Thailand'])] # 将产地是泰国的数据进行提取
输出结果:
id | date | money | product | department | origin | level | sign | |
---|---|---|---|---|---|---|---|---|
4 | 105 | 2020-03-14 | 15.000000 | 菠萝 | 水果 | Thailand | high | NaN |
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 |
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 |
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 |
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
data.query('department=="饮料"').count() # 对饮料类型的数据进行筛选后计数
data.query('department=="饮料"').money.count() # 对筛选后的数据按照money进行计数
输出结果:2
data.query('department=="饮料"').money.sum() # 在筛选后的数据中,对money进行求和
输出结果:9.0
data.groupby("department").count()
data.groupby("department")['id'].count()
输出结果:
冷冻食品 | 1 |
---|---|
日用品 | 2 |
水果 | 1 |
蔬菜 | 1 |
调味品 | 1 |
零食 | 2 |
饮料 | 2 |
data.groupby(["department","origin"]).count()
data.groupby("department")['money'].agg([len, np.sum, np.mean])
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 |
data.describe().round(2).T # round表示小数位数,T表示转置(这一函数之前提及过)
data['money'].std()
输出结果:18.14754345175493
data.cov()
输出结果:
id | money | |
---|---|---|
id | 9.166667 | -2.666667 |
money | -2.666667 | 329.333333 |
data.corr()
输出结果:
id | money | |
---|---|---|
id | 1.000000 | -0.048534 |
money | -0.048534 | 1.000000 |
笔记中如果有错误的地方,欢迎各位小伙伴指正,感谢!
如果需要完整思维导图电子版(PDF、Xmind等)可以留言或者私信!
参考资料:
- pandas官网
- pandas用法总结
- Pandas 文本数据方法 capitalize( ) lower( ) upper( )
- python【all()全1为1, any()全0为0】
- pandas 数据类型转换