Pandas 数据选取的 4 种方式。

4 种方式:

  • 使用 loc() 和 iloc() 选取单独几行
  • 使用 isin() 查找和选取对应数据
  • 使用 unique() 选出唯一值
  • 使用 df.nlargest() 和 df.nsmallest()

使用loc和iloc选取单独几行

使用loc 按行索引标签选取数据

1
2
3
4
5
6
7
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': pd.date_range('2019/01/01',periods=6),
'B': ['a','b','c','d','e', 'f'],
'C': np.arange(10, 16)})
df = df.set_index('A')
df

image.png

1
2
3
4
5
#  选取单独一行
# df.loc['2019-01-01']

# 选取从2019-01-01行到2019-01-03行
df.loc['2019-01-01':'2019-01-03']

image.png

1
2
# 选取从2019-01-01行到2019-01-03行,对应的B列
df.loc['2019-01-01':'2019-01-03','B' ]
1
2
3
4
5
A
2019-01-01 a
2019-01-02 b
2019-01-03 c
Name: B, dtype: object
1
2
3
4
5
# 选出B列中类型是c的行
# df[df['B'] == 'c']

# 选出B列中类型是c的行
df.loc[df['B']=='c']

image.png

使用iloc按索引位置选取数据

1
2
# 选取第1行的数据,Series格式
df.iloc[0]
1
2
3
B     a
C 10
Name: 2019-01-01 00:00:00, dtype: object
1
2
# 选取第1行的数据,DataFrame格式
df.iloc[[0]]

image.png

1
2
# 选取第1行,第2个列的数值
df.iloc[0, 1]
1
10
1
2
# 选择第1行和第4行数据,前闭后开
df.iloc[[0,4]]

image.png

使用isin()查找和选取对应数据

1
2
3
df = pd.DataFrame({'A': pd.date_range('2019/01/01',periods=5), 
'B': ['a','b','c','d','e']})
df

image.png

1
2
3
data = ['2019-01-01', '2019-01-03']
df = df.loc[df['A'].isin(data), ['A','B']]
df

image.png

使用unique()选出唯一值

1
2
3
4
5
6
import numpy as np
A = [1, 2, 2, 5,3, 4, 3]

# unique()选出唯一值,并且会按照升序排列
a = np.unique(A)
a
1
array([1, 2, 3, 4, 5])
1
2
3
# return_index=True表示返回新列表元素在旧列表中的位置,并以列表形式储存在s中
a, s= np.unique(A, return_index=True)
s
1
array([0, 1, 4, 5, 3])
1
2
3
# return_inverse=True 表示返回旧列表元素在新列表中的位置,并以列表形式储存在p中
a, s, p = np.unique(A, return_index=True, return_inverse=True)
p
1
array([0, 1, 1, 4, 2, 3, 2])

使用 df.nlargest() 和 df.nsmallest()

在之前的实现方式,df.head() 用来查看前多少行数据,然后需要找到最大的话,往往分两步,把 df 进行排序,然后选择前多少行数据。而这两个函数分别是取df最大的前几个,和最小的前几个,比较实用。

参数解释

tips.nlargest(n, columns, keep=’first’)

  • n:前xx个,int值
  • columns:列名
  • keep='first':keep=’first’或者’last’。当出现重复值时,keep=’first’,会选取在原始DataFrame里排在前面的数据,keep=’last’则去排后面的数据。

还是拿小费数据集演示下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 导入包
import seaborn as sns
from pandas import Series,DataFrame
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 拿到小费数据集
tips = sns.load_dataset('tips')

# 数据介绍: total_bill列为消费总金额;tip列为小费金额;sex列为顾客性别;smoker列为顾客是否抽烟;day列为消费的星期;time列为聚餐的时间段;size列为聚餐人数

# 查看前5行数据
tips.head()

image.png

1
2
# 选择最大的前5行,total_bill 数据列
tips.nlargest(5,'total_bill')

image.png

1
2
# 选择最小的前5行,total_bill 数据列
tips.nsmallest(5,'total_bill',keep='last')

image.png