Pandas使用技巧
Pandas是一个开源的,BSD许可的库,为Python (opens new window)编程语言提供高性能,易于使用的数据结构和数据分析工具。
入门
loc && iloc
区别
- loc: 通过行标签索引行数据
- iloc: 通过行号索引行数据
- ix: 通过行标签或者行号索引行数据(基于loc和iloc 的混合)
iloc是按照行数取值,而loc按着index名取值
loc
1import numpy as np
2import pandas as pd
3from pandas import *
4from numpy import *
5
6data=DataFrame(np.arange(16).reshape(4,4),index=list("ABCD"),columns=list("wxyz"))
7print(data)
8# w x y z
9#A 0 1 2 3
10#B 4 5 6 7
11#C 8 9 10 11
12#D 12 13 14 15
13
14#loc
15#行的选取
16print(data.loc["A"])
17print(type(data.loc["A"]))
18#w 0
19#x 1
20#y 2
21#z 3
22#Name: A, dtype: int32
23#<class 'pandas.core.series.Series'>
24
25print(data.loc[["A"]])
26print(type(data.loc[["A"]]))
27# w x y z
28#A 0 1 2 3
29#<class 'pandas.core.frame.DataFrame'>
30#综上,[]返回Series,[[]]返回DataFrame
31
32print(data.loc["A","w"])
33print(type(data.loc["A","w"]))
34#0
35#<class 'numpy.int32'>
36
37print(data.loc[:,"w"])
38print(type(data.loc[:,"w"]))
39#A 0
40#B 4
41#C 8
42#D 12
43#Name: w, dtype: int32
44#<class 'pandas.core.series.Series'>
45
46print(data.loc["A":"C"])
47print(type(data.loc["A":"C"]))
48# w x y z
49#A 0 1 2 3
50#B 4 5 6 7
51#C 8 9 10 11
52#<class 'pandas.core.frame.DataFrame'>
53
54print(data.loc["A":"C","w":"y"])
55print(type(data.loc["A":"C","w":"y"]))
56# w x y
57#A 0 1 2
58#B 4 5 6
59#C 8 9 10
60#<class 'pandas.core.frame.DataFrame'>
61
62print(data.loc[["A","C"],["w","y"]])
63print(type(data.loc[["A","C"],["w","y"]]))
64# w y
65#A 0 2
66#C 8 10
67#<class 'pandas.core.frame.DataFrame'>
68
69print(data.loc[:,["w","y"]])
70print(type(data.loc[:,["w","y"]]))
71# w y
72#A 0 2
73#B 4 6
74#C 8 10
75#D 12 14
76#<class 'pandas.core.frame.DataFrame'>
77
78#列的选取
79print(data["w"])#等同于print(data.loc[:,"w"])
80#A 0
81#B 4
82#C 8
83#D 12
84#Name: w, dtype: int32
85print(data.loc[:,"w"])
86#A 0
87#B 4
88#C 8
89#D 12
90#Name: w, dtype: int32
91print(data["w"].equals(data.loc[:,"w"]))#True
92
93#根据特殊条件选取行列
94print(data["w"]>5)
95#A False
96#B False
97#C True
98#D True
99#Name: w, dtype: bool
100
101print(data.loc[data["w"]>5])
102# w x y z
103#C 8 9 10 11
104#D 12 13 14 15
105print(data.loc[data["w"]>5,"w"])
106print(type(data.loc[data["w"]>5,"w"]))
107#C 8
108#D 12
109#Name: w, dtype: int32
110#<class 'pandas.core.series.Series'>
111print(data.loc[data["w"]>5,["w"]])
112print(type(data.loc[data["w"]>5,["w"]]))
113# w
114#C 8
115#D 12
116#<class 'pandas.core.frame.DataFrame'>
117print(data["w"]==0)
118print(data.loc[lambda data:data["w"]==0])
119print(type(data.loc[lambda data:data["w"]==0]))
120#A True
121#B False
122#C False
123#D False
124#Name: w, dtype: bool
125# w x y z
126#A 0 1 2 3
127#<class 'pandas.core.frame.DataFrame'>
128
129#loc赋值
130print(data)
131# w x y z
132#A 0 1 2 3
133#B 4 5 6 7
134#C 8 9 10 11
135#D 12 13 14 15
136data.loc[["A","C"],["w","x"]]=999
137print(data)
138# w x y z
139#A 999 999 2 3
140#B 4 5 6 7
141#C 999 999 10 11
142#D 12 13 14 15
iloc
1data=DataFrame(np.arange(16).reshape(4,4),index=list("ABCD"),columns=list("wxyz"))
2print(data)
3# w x y z
4#A 0 1 2 3
5#B 4 5 6 7
6#C 8 9 10 11
7#D 12 13 14 15
8
9print(data.iloc[0])
10print(type(data.iloc[0]))
11#w 0
12#x 1
13#y 2
14#z 3
15#Name: A, dtype: int32
16#<class 'pandas.core.series.Series'>
17#print(data.iloc["A"])报错
18
19#print(data.loc[0])报错
20print(data.loc[["A"]])
21print(type(data.loc["A"]))
22# w x y z
23#A 0 1 2 3
24#<class 'pandas.core.series.Series'>
删除数据
drop函数
语法:
1DataFrame.drop(labels,axis=0,level=None,inplace=False,errors='raise')
| 参数 | 说明 |
|---|---|
| labels | 接收string或array,代表要删除的行或列的标签(行名或列名)。无默认值 |
| axis | 接收0或1,代表操作的轴(行或列)。默认为0,代表行;1为列。 |
| level | 接收int或索引名,代表标签所在级别。默认为None |
| inplace | 接收布尔值,代表操作是否对原数据生效,默认为False |
| errors | errors='raise’会让程序在labels接收到没有的行名或者列名时抛出错误导致程序停止运行,errors='ignore’会忽略没有的行名或者列名,只对存在的行名或者列名进行操作。默认为‘errors=‘raise’’。 |
删除列
1del df['columns'] # 改变原始数据
2df.drop('columns',axis=1) # 删除不改表原始数据,可以通过重新赋值的方式赋值该数据
3df.drop('columns', axis=1,inplace='True') # 改变原始数据
4df.drop(["columns1", "columns2", "columns3"], axis=1,inplace='True') # 删除多列,改变原始数据
删除行
1df.drop(labels=['a', 'b'], axis=1) # 同时删除a,b列
2df.drop(labels=range(2)) # 等价于df.drop(labels=[0,1])
遍历
按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]或row.name对元素进行访问。
iterrows
1for index, row in df.iterrows():
2 print(row['s0']) # 也可使用 row.s0
itertuples
1for index, row in df.iteritems():
2 print(row[0])
iteritems
1for index, row in df.iteritems():
2 print(row[0])
排序
df. sort_values()
1DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
参数说明
| 参数 | 值 | 说明 |
|---|---|---|
| axis | {0 or ‘index’, 1 or ‘columns’},default 0, | 默认按照列排序,即纵向排序;如果为1,则是横向排序。 |
| by | str or list of str; | 如果axis=0,那么by="列名";如果axis=1,那么by="行名"。 |
| ascending | 布尔型, | True则升序,如果by=['列名1','列名2'],则该参数可以是[True, False],即第一字段升序,第二个降序。 |
| inplace | 布尔型 | 是否用排序后的数据框替换现有的数据框。 |
| kind | str {‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’ | 排序算法,似乎不用太关心。 |
| na_position | {‘first’, ‘last’}, default ‘last’, | 默认缺失值排在最后面。 |
1df.sort_index()
2df.sort_index(ascending=False)
df. sort_index()
调用方式
1sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
参数说明
| 参数 | 说明 |
|---|---|
| axis | 0按照行名排序;1按照列名排序 |
| level | 默认None,否则按照给定的level顺序排列---貌似并不是,文档 |
| ascending | 默认True升序排列;False降序排列 |
| inplace | 默认False,否则排序之后的数据直接替换原来的数据框 |
| kind | 排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心。 |
| na_position | 缺失值默认排在最后{"first","last"} |
| by | 按照某一列或几列数据进行排序,但是by参数貌似不建议使用 |
去重
drop_duplicates
1def drop_duplicates(
2 self,
3 subset: Optional[Union[Hashable, Sequence[Hashable]]] = None,
4 keep: Union[str, bool] = "first",
5 inplace: bool = False,
6 ignore_index: bool = False,
7 ) -> Optional[DataFrame]:
8 pass
参数说明:
- subset:指定重复数据所在列
- keep:(1)first:去除重复列后第一次出现的行数据;(2)last:去除重复列后最后一次出现的行数据;(3)False:删除所有重复项
- inplace:True:直接在原数据删除;False:不直接在原数据删除并生成一个副本
重命名
1def rename(
2 self,
3 mapper: Optional[Renamer] = None,
4 *,
5 index: Optional[Renamer] = None,
6 columns: Optional[Renamer] = None,
7 axis: Optional[Axis] = None,
8 copy: bool = True,
9 inplace: bool = False,
10 level: Optional[Level] = None,
11 errors: str = "ignore",
12 ) -> Optional[DataFrame]:
13 pass
14
15# 将a,b,c 替换成A,B,C
16df.rename(columns={'a': 'A', 'b': 'B', 'c': 'C'}, inplace=True)
参数说明
- mapper: 字典值,键表示旧名称,值表示新名称。这些参数只能一次使用。
- axis: int或字符串值,“ 0”表示行,“ 1”表示列。
- copy: 如果为True,则复制基础数据。
- inplace: 如果为True,则在原始 DataFrame 中进行更改。
- level: 用于在数据帧具有多个级别索引的情况下指定级别。
清洗空值
如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
1DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:
- axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
- how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
- thresh:设置需要多少非空值的数据才可以保留下来的。
- subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
- inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。