Pandas使用技巧

Pandas是一个开源的,BSD许可的库,为Python (opens new window)编程语言提供高性能,易于使用的数据结构和数据分析工具。

入门

Pandas入门文档

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
errorserrors='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,则是横向排序。
bystr or list of str;如果axis=0,那么by="列名";如果axis=1,那么by="行名"。
ascending布尔型,True则升序,如果by=['列名1','列名2'],则该参数可以是[True, False],即第一字段升序,第二个降序。
inplace布尔型是否用排序后的数据框替换现有的数据框。
kindstr {‘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)

参数说明

参数说明
axis0按照行名排序;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,修改的是源数据。