Fork me on GitHub

Python_Compute

帮助函数 S.method?

Pandas

1.什么是Series

简单来说:一维带标签(索引)的数组

2.Series的特征

  • 数组中的数据可以是任意的类型,包括整数、浮点数、字符串、列表、字典等python对象
  • 数组中的数据应为同一类型

    创建Series

    一般格式
    s = pd.Series(data,index = index)

  • 通过列表list创建Series

    1
    2
    3
    4
    import pandas as pd
    import numpy as np
    s = pd.Series([10,30,20,40])
    si
  • 通过字典dictionary创建Series

    1
    2
    3
    dict_1 = {"a":10,"c":5,"b":40}
    s1 = pd.Series(dict_1)
    s1

字典和Series的区别:

字典是无序的,Series是有序的,通过无序的字典来创建Series后,Series会将字典的键作为自己的索引,并且按升序方式排列

  • 通过数组array创建Series
    1
    2
    3
    array_1 = np.arange(10,16)
    s2 = pd.Series(array_1,index=list("abcdef")) # 设置index
    s2

Series的属性

  • 获得索引index
    1
    2
    s2.index
    Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')

索引为迭代器

  • 通过赋值整体地修改索引值
    1
    2
    s2.index = ["aa","bb","cc","dd","eee","fff"]
    s2

要点:新设置的索引个数必须与原来索引个数一致
值得一提的是:提取单个索引值来修改是不允许的,如果要修改索引值,就得全部重新设置

  • 修改index的名称

    1
    2
    s2.index.name = "banana"
    s2
  • 修改Series的名称

    1
    s2.name = "length"
  • 获取Series的值values

    1
    s2.values

通过以上我们发现,Series对象本身及其索引都有name属性

Series的索引 index

  • 位置索引

    1
    2
    #得到第一行的数
    s2[0]
  • 得到最后一行的数

    1
    s2[-1]
  • 得到特定一些行的数(如第1行,第4行,第6行)

    1
    s2[[0,3,5]]

*名称索引

1
2
#得到索引为aa所对应的数
s2["aa"]

Series的切片slice

  • 索引位置切片
    1
    s2[1:4]

没有包含末端

  • 索引名称切片
    1
    s2["aa":"eee"]

包含末端

修改Series的值

1
2
3
4
s2[index] = value (index表示需要修改的值所对应的索引)
s2[i] = value (i表示需要修改的值所对应的索引位置)
s2["aa"] = 100
s2[2] = 120

添加Series的值

  • 返回一个新的Series,不修改原来的Series
    1
    s2.append(pd.Series([value1,value2,...],index = [index1,index2,...]))
1
2
#添加Series的值,并返回一个新的Series
s2.append(pd.Series([50,60],index=["a1","a2"]))
  • 直接在原来的基础上修改Series
    1
    s2["new index"] = value
  • 通过append来添加Series的值,特点是:
  1. 返回一个新的Series
  2. 批量修改
  • 通过s2["new index"] = value这种方式来添加的值,特点是:
  1. 直接在原来的Series基础上增加值
  2. 每次只能增加一个值

删除Series的值

del s2[index]

1
2
#删除y索引对应的99这个值
del s2["y"]

过滤Series的值

通过布尔选择器(条件筛选)来过滤掉一些值,从而得到满足条件的值

1
2
3
4
5
6
7
8
9
s2[s2 < value]
s2[s2 > value]
s2[s2 == value]
s2[s2 != value]

#单条件筛选
s2[s2 > 90]
#多条件筛选
s2[(s2 > 50) | (s2 < 14)]

Series的缺失值处理

  • 创建一个带有缺失值的Series
    1
    2
    # np.nan
    s = pd.Series([10,np.nan,15,19,None])

提示:None值会被当做NA处理
*

  • 判断是否有缺失值
    isnull()
  • 判断s中的缺失值
    s.isnull()
  • 如果需要取出这些缺失值,则通过布尔选择器来筛选出来
    s[s.isnull()]
  • 删除缺失值

    1
    2
    3
    4
    5
    6
    #dropna()会删除掉所有缺失值NaN,并返回一个新的Series
    #原有的Series并未发生改变
    s.dropna()
    #如果希望原有的Series发生改变,
    #可以将s.dropna()返回的新Series直接赋值给原来的Series
    s = s.dropna()

    此外,我们也可以通过过滤的方式来达到一样的删除效果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    data[~data.isnull()]
    data[data.notnull()]

    s = pd.Series([10,np.nan,15,19,None]) #初始化一下s
    #依然是返回一个新的Series,波浪号~表示否定、非的意思
    s[~s.isnull()]
    #也可以使用 s.notnull
    #通过notnull()也能实现,同样也是返回一个新的Series
    s[s.notnull()]
  • 填充缺失值
    fillna() :用指定值或插值的方式填充缺失值


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    用指定值填充缺失值
    #用0填充缺失值,返回的依然是一个新的Series
    s.fillna(value=0)

    #如果希望直接修改原Series
    #一种方法是之前说的直接赋值,另一种是添加参数inplace=True
    s.fillna(value=0,inplace=True)

    #用插值填充缺失值
    #初始化一下s
    s = pd.Series([10,np.nan,15,19,None])

    #向前填充(ffill,全称是front fill)

    s.fillna(method="ffill")

    #向后填充(bfill,全称是back fill)

    s.fillna(method="bfill")`

排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#创建一个Series
s3 = pd.Series([10,15,8,4,20],index=list("gadkb"))
s3
g 10
a 15
d 8
k 4
b 20
dtype: int64

#(1)根据索引排序
#sort_index() 默认升序,如果添加参数ascending=False,则降序排列

#(2)根据索引升序排列
# 根据值排序 sort_values
s3.sort_index()
a 15
b 20
d 8
g 10
k 4
dtype: int64
#根据索引降序排列
s3.sort_index(ascending=False)

排名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# rank()

# 创建一个用来排名的Series
s4 = pd.Series([2,5,15,7,1,2])
s4
0 2
1 5
2 15
3 7
4 1
5 2

# 中国式排名
s4.rank(ascending=False,method="dense")
0 4.0
1 3.0
2 1.0
3 2.0
4 5.0
5 4.0

Series的描述性统计

  • 值的计数 Series.value_counts()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#创建一个Series
s5 = pd.Series([100,50,100,75,24,100])
s5

#值的计数 Series.value_counts()
s5.value_counts()
100 3
75 1
50 1
24 1

#最小值 s5.min()
s5.min()
24
#最大值 s5.max()
s5.max()
100
#中位数 s5.median()
s5.median()
#均值 s5.mean()
s5.mean()
74.83333333333333
#求和 s5.sum()
s5.sum()
449
#标准差 s5.std()
s5.std()
31.940048006643114

#描述性统计 s5.describe()
s5.describe().round(1) # round表示小数点后多少位
count 6.0
mean 74.8
std 31.9
min 24.0
25% 56.2
50% 87.5
75% 100.0
max 100.0

Series的向量化运算

可对Series进行批量操作,并且返回一个新的Series
并不会在原基础上直接修改

1
2
3
s5 + 1000
s5 * 2
s5 / 10

自动对齐相同索引的数据,不同索引的数据对不上,则显示NaN

1
2
3
4
5
6
7
8
9
s6 = pd.Series([35000,40000,71000,5500],index=list("abcd"))
s7 = pd.Series([222,35000,4000,2222],index=list(aqtb))
s6 + s7
a 35222.0
b 42222.0
c NaN
d NaN
q NaN
t NaN

喜欢的可以对我打赏了哟~