Python数据分析大杀器之Pandas基础2万字详解(学pandas基础,这一篇就够啦)

Posted JoJo的数据分析历险记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析大杀器之Pandas基础2万字详解(学pandas基础,这一篇就够啦)相关的知识,希望对你有一定的参考价值。

Python数据分析


  • 🌸个人主页:JoJo的数据分析历险记
  • 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 💌如果文章对你有帮助,欢迎关注、点赞、收藏、订阅专栏

本专栏主要介绍python数据分析领域的应用
参考资料:
利用python数据分析

文章目录

我们介绍了Numpy在数据处理方面的应用,本文介绍一下pandas在数据处理方面的应用,pandas可以是基于numpy构建的,但是可以让数据处理变得更便捷

导入相关库

import numpy as np
import pandas as pd

💮1.Series 对象

pandas主要有两个数据对象,一个是Series,类似于一个向量的形式,另一个是DataFrame数据框形式。我们先来看一下如何创建一个Series数据对象。

s = pd.Series([12,-4,7,9])
s
0    12
1    -4
2     7
3     9
dtype: int64

🏵️1.1 Series基本操作

#选择内部元素
s[2]
7
#为元素赋值
s[2]=5
s
s['a'] = 4
s
0    12
1    -4
2     5
3     9
a     4
dtype: int64
#用其它对象定义新的series对象
arr = np.array([1,2,3,4])
#此时s2只是原来的一个动态视图,会随数组的改变而改变,例如我们改变原来数组中的第二个元素值
s2 = pd.Series(arr)
s2
arr[1] = 9
s2


0    1
1    9
2    3
3    4
dtype: int32
#筛选元素
s[s>8]
0    12
3     9
dtype: int64
#Series对象的组成元素
serd = pd.Series([1,0,2,1,2,3], index=['white','white','blue','green','green','yellow'])
serd
white     1
white     0
blue      2
green     1
green     2
yellow    3
dtype: int64
#unique去重 返回一个数组
serd.unique()
array([1, 0, 2, 3], dtype=int64)
#value_counts 去重 返回出现次数
serd.value_counts()
2    2
1    2
3    1
0    1
dtype: int64
#isin 函数,返回布尔值
serd.isin([0,3])
white     False
white      True
blue      False
green     False
green     False
yellow     True
dtype: bool
serd[serd.isin([0,3])]
white     0
yellow    3
dtype: int64
#NaN
s2 = pd.Series([-5,3,np.NaN,14])
s2
0    -5.0
1     3.0
2     NaN
3    14.0
dtype: float64
# 用isnull 和 notnull 来进行判断
s2.isnull()
s2.notnull()
0     True
1     True
2    False
3     True
dtype: bool
s2

0    -5.0
1     3.0
2     NaN
3    14.0
dtype: float64
#用作字典
mydict = 'red':2000,'blue':1000,'yellow':500,'orange':1000
myseries = pd.Series(mydict)
myseries
red       2000
blue      1000
yellow     500
orange    1000
dtype: int64

当出现缺失值时,会直接用NaN替代



colors = ['red','blue','yellow','orange','green']
myseries = pd.Series(mydict, index = colors)
myseries
red       2000.0
blue      1000.0
yellow     500.0
orange    1000.0
green        NaN
dtype: float64

进行运算时有NaN为NaN


mydict2 ='red':400,'yellow':1000,"black":700
myseries2 = pd.Series(mydict2)
myseries.fillna(0) + myseries2.fillna(0)
black        NaN
blue         NaN
green        NaN
orange       NaN
red       2400.0
yellow    1500.0
dtype: float64

🌹2.DataFrame对象

DataFrame对象是我们在进行数据分析时最常见的数据格式,相当于一个矩阵数据,由不同行不同列组成,通常每一列代表一个变量,每一行代表一个观察数据。我们先来看一下DataFrame的一些基础应用。

创建DataFrame对象

#DataFrame对象
data = 'color':['blue','green','yellow','red','white'],
        'object':['ball','pen','pencil','paper','mug'],
        'price':[1.2,1.0,0.6,0.9,1.7]
frame = pd.DataFrame(data)
frame
colorobjectprice
0blueball1.2
1greenpen1.0
2yellowpencil0.6
3redpaper0.9
4whitemug1.7
frame2 = pd.DataFrame(data, columns=['object','price'])
frame2
objectprice
0ball1.2
1pen1.0
2pencil0.6
3paper0.9
4mug1.7
frame3 = pd.DataFrame(data,index=['one','two','three','four','five'])
frame3
colorobjectprice
oneblueball1.2
twogreenpen1.0
threeyellowpencil0.6
fourredpaper0.9
fivewhitemug1.7
#选取元素
#获得所有列的名称
frame.columns

Index(['color', 'object', 'price'], dtype='object')
#获得所有行的名称
frame.index
RangeIndex(start=0, stop=5, step=1)
#获得所有值
frame.values
array([['blue', 'ball', 1.2],
       ['green', 'pen', 1.0],
       ['yellow', 'pencil', 0.6],
       ['red', 'paper', 0.9],
       ['white', 'mug', 1.7]], dtype=object)
#获得某一列的值
frame['price']
0    1.2
1    1.0
2    0.6
3    0.9
4    1.7
Name: price, dtype: float64
#获得行的值 用ix属性和行的索引项
frame.iloc[2]

color     yellow
object    pencil
price        0.6
Name: 2, dtype: object
#指定多个索引值能选取多行
frame.iloc[[2,4]]
colorobjectprice
2yellowpencil0.6
4whitemug1.7
#可以用frame[0:1]或者frame[0:2]选择行  但切记frame[0]没有数
frame[0:4]

对DataFrame进行行选择时,使用索引frame[0:1]返回第一行数据,[1:2]返回第二行数据

colorobjectprice
0blueball1.2
1greenpen1.0
2yellowpencil0.6
3redpaper0.9
#如果要获取其中的一个元素,必须依次指定元素所在的列名称、行的索引值或标签
frame['object'][3]

'paper'
#赋值
frame['new']=12 #直接添加某一列
frame
colorobjectpricenew
0blueball1.212
1greenpen1.012
2yellowpencil0.612
3redpaper0.912
4whitemug1.712
frame['new']=[1,2,3,4,5]
frame
colorobjectpricenew
0blueball1.21
1greenpen1.02
2yellowpencil0.63
3redpaper0.94
4whitemug1.75
#修改单个元素的方法
frame['price'][2]=3.3
frame

colorobjectpricenew
0blueball1.21
1greenpen1.02
2yellowpencil3.33
3redpaper0.94
4whitemug1.75
# 删除一整列的所有数据,用del
frame['new'] = 12
frame
del frame['new']
frame
colorobjectprice
0blueball1.2
1greenpen1.0
2yellowpencil3.3
3redpaper0.9
4whitemug1.7
#筛选元素
frame3 = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['red','white','blue','green'],
                      columns=['ball','pen','pencil','paper'])
frame3
frame3[frame3>12]
ballpenpencilpaper
redNaNNaNNaNNaN
whiteNaNNaNNaNNaN
blueNaNNaNNaNNaN
greenNaN13.014.015.0
#用嵌套字典生成DataFrame对象 当出现缺失值时用NaN替代
nestdict = 'red':2012:22, 2013:33,'white':2011: 13,2012:22,2013:16,'blue':2011:17,2012:27,2013:48
nestdict
'red': 2012: 22, 2013: 33,
 'white': 2011: 13, 2012: 22, 2013: 16,
 'blue': 2011: 17, 2012: 27, 2013: 48
frame2 = pd.DataFrame(nestdict)
frame2
redwhiteblue
2011NaN1317
201222.02227
201333.01648

进行转置

frame2.T
201120122013
redNaN22.033.0
white13.022.016.0
blue17.027.048.0
#index对象
ser = pd.Series([5,0,3,8,4], index=['red','blue','yellow','white','green'])
ser.index
Index(['red', 'blue', 'yellow', 'white', 'green'], dtype='object')
ser.idxmax()
'white'
ser.idxmin()
'blue'
#含重复标签的Index
serd = pd.Series(range(6), index=['white','white','blue','green','green','yellow'])
serd
white     0
white     1
blue      2
green     3
green     4
yellow    5
dtype: int64
#当一个标签对应多个元素时,返回一个Series对象 而不是单个元素
serd['white']
white    0
white    1
dtype: int64
#判断是否由重复值, is_unique
#索引对象的其他功能
ser = pd.Series([2,5,7,4],index = ['one','two','three','four'])
ser
one      2
two      5
three    7
four     4
dtype: int64
#reindex()函数可以更换series对象的索引,生成一个新的series对象
ser.reindex(['three','one','five','two'])
three    7.0
one      2.0
five     NaN
two      5.0
dtype: float64
ser3 = pd.Series([1,5,6,3],index=[0,3,5,6])
ser3
0    1
3    5
5    6
6    3
dtype: int64
#自动插补
#reindex()函数,method:ffill 表示插补的数为前面的值,bfill表示插补的数为后面的值
ser3.reindex(range(6),method='ffill')

0    1
1    1
2    1
3    5
4    5
5    6
dtype: int64
ser3.reindex(range(8),method='bfill')
0    1.0
1    5.0
2    5.0
3    5.0
4    6.0
5    6.0
6    3.0
7    NaN
dtype: float64
frame.reindex(range(5), method='ffill',columns=['colors','price','new','object'])
colorspricenewobject
0blue1.2blueball
1green1.0greenpen
2yellow3.3yellowpencil
3red0.9redpaper
4white1.7whitemug
ser = pd.Series(np.arange(4.),index=['red','blue','yellow','white'])
ser
red       0.0
blue      1.0
yellow    2.0
white     3.0
dtype: float64
ser.drop('yellow')
red      0.0
blue     1.0
white    3.0
dtype: float64
ser.drop(['blue','white'])
red       0.0
yellow    2.0
dtype: float64
frame = pd.DataFrame(np.arange(16).reshape((4,4)),
                    index=['red','blue','yellow','white'],
                    columns=['ball','pen','pencil','paper'])
frame
ballpenpencilpaper
red0123
blue4567
yellow891011
white12131415
#删除时默认是行 axis指定轴,1为列
frame.drop(['pen'],axis=1)
ballpencilpaper
red023
blue467
yellow81011
white121415

🥀3.pandas基本数据运算

🌺3.1 算术运算

  • 当有两个series或DataFrame对象时,如果一个标签,两个对象都有,则把他们的值相加
  • 当一个标签只有一个对象有时,则为NaN
s1 = pd.Series([3,2,5,1],index=['white','yellow','green','blue'])
s1
white     3
yellow    2
green     5
blue      1
dtype: int64
s2 = pd.Series([1,4,7,2,1],['white','yellow','black','blue','brown'])
s1 + s2
black     NaN
blue      3.0
brown     NaN
green     NaN
white     4.0
yellow    6.0
dtype: float64
# DateFrame对象也一样
frame1 = pd.DataFrame(np.arange(16).reshape((4,4)),
                     columns=['ball','pen','pencil','paper'],
                      index = ['red','blue','yellow','white'])
frame1
ballpenpencilpaper
red0123
blue4567
yellow891011
white12131415
frame2 = pd.DataFrame(np.arange(12).reshape((4,3)),
                     index = ['blue','yellow','green','white']
                     ,columns=['ball','pen','mug'])
frame2
ballpenmug
blue012
yellow345
green678
white91011
frame3 = frame1+frame2
frame3
ballmugpaperpenpencil
blue4.0NaNNaN6.0NaN
greenNaNNaNNaNNaNNaN
redNaNNaNNaNNaNNaN
white21.0NaNNaN23.0NaN
yellow11.0NaNNaN13.0NaN

🌻3.2 基本算术运算符

主要的算术运算符如下

  • add() frame1.add(frame2) = frame1+frame2
  • sub()
  • div()
  • mul()

下面通过一些案例来说明

frame = pd.DataFrame(np.arange(16).reshape((4,4)),
                     columns=['ball','pen','pencil','paper'],
                      index = ['red','blue','yellow','white'])
frame
ballpenpencilpaper
red0123
blue4567
yellow891011
white12131415
ser = pd.Series(np.arange(4),['ball','pen','pencil','paper'])
ser #与frame 的列名称保持一致,行不可以
ball      0
pen       1
pencil    2
paper     3
dtype: int32
frame-ser
ballpenpencilpaper
red0000
blue4444
yellow8888
white12121212

当索引项只存在于其中一个数据结构时,那么运算结果会为其产生一个新的索引项,但其值为NaN

具体案例如下,我们给ser增加一列mug

ser['mug'] = 9
ser
ball      0
pen       1
pencil    2
paper     3
mug       9
dtype: int64
frame - ser
ballmugpaperpenpencil
red0NaN000
blue4NaN444
yellow8NaN888
white12NaN121212

🌼3.3 函数映射

在dataframe和series数据对象中,可以使用函数对所有元素进行操作

frame
ballpenpencilpaper
red0123
blue4567
yellow891011
white12131415
# 求所有元素的平方根
np.sqrt(frame)

ballpenpencilpaper
red0.0000001.0000001.4142141.732051
blue2.0000002.2360682.4494902.645751
yellow2.8284273.0000003.1622783.316625
white3.4641023.6055513.7416573.872983
#定义函数
#法一:
f = lambda x:x.max()-x.min()#返回数组取值范围
#法二:
def f(x):
    return x.max()-x.min()

# apply函数可以调用定义的函数

frame.apply(f)
ball      12
pen       12
pencil    12
paper     12
dtype: int64
def f(x):
    return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f,axis = 1)
# 默认axis=0
minmax
red03
blue47<

以上是关于Python数据分析大杀器之Pandas基础2万字详解(学pandas基础,这一篇就够啦)的主要内容,如果未能解决你的问题,请参考以下文章

Python数据可视化大杀器之Seaborn:学完可实现90%数据分析绘图

Golang 大杀器之性能剖析 PProf

小工匠聊架构- 提升性能的大杀器之缓存技术

AI画家——毕业设计大杀器之Flask

golang大杀器GMP模型

spacemacs:emacs和vim结合,大杀器。vim党转emacs

(c)2006-2024 SYSTEM All Rights Reserved IT常识