目录
一、直接用方括号[]取下标读取,DataFrame[列标签][行标签]
二、用DataFrame.loc[行标签,列标签]按照行/列标签名index读取
三、用DataFrame.iloc[行序列,列序列]按所在行/列号读取
四、DataFrame.ix[]
本人小白一枚,正在自学python,pandas模块的DataFrame数据类型是一个处理表格数据的强大工具,下面是我对读取DataFrame内指定数据的方法进行了初步学习与探索。
1、只用一个[],读取整列数据:
当DataFrame数据没有定义字符串列标签名时只能用序列数字读取对应列的数据。
当DataFrame数据定义了字符串列标签名时只能用列标签名读取对应列的数据。
[]内用列表读取多列数据。
Ps:[]内是数字切片时,无论DataFrame数据是否有列标签名,都按行序列读取对应范围的整行数据,遵循左开右闭原则。
2、用两个[],第一个[]是要选取的列标签,第二个[]是要选取的行标签:
无论DataFrame数据是否定义字符串行标签名,第二个[]都可以用数字序列表示对应的行。
第二个[]可以用序列号或行标签名切片选取范围,序列号切片左开右闭,行标签名切片左右均包含。
不能读取多列单/多行数据。
DataFrame数据重新排序后,第二个[]用的序列号依然是原来的index,不是新的行号。
下面用定义了行、列标签的df和没有定义行、列标签的df1进行代码示例:
import pandas as pd
df = pd.DataFrame(
[[0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[20, 21, 22, 23, 24],
[30, 31, 32, 33, 34],
[40, 41, 42, 43, 44]],
columns=list('ACBDE'),
index=list('abcde')
)
df1 = pd.DataFrame(
[[0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[20, 21, 22, 23, 24],
[30, 31, 32, 33, 34],
[40, 41, 42, 43, 44]]
)
print(df['A']) # 读取A列数据
print(df['A':'C']) # 返回空DataFrame,DataFrame数据有列标签时不能使用切片
print(df[['A', 'C']]) # 读取A、C两列数据
print(df[['A', 'B', 'C']]) # 读取A、B、C三列数据,列顺序按列表顺序重排
print(df1[0]) # DataFrame数据没有列标签时,读取第1列数据
print(df[0:3]) # 数字切片按行序列读取
print(df1[0:3]) # 数字切片按行序列读取
print(df1[[0, 2]]) # 读取第1、3两列数据
print(df1[[0, 2, 1]]) # 读取第1、3、2三列数据,列顺序按列表顺序重排
print(df['A'][0]) # 读取A列第一行数据,即A列a行数据
print(df['A']['a']) # 读取A列a行数据,即A列第一行数据
print(df['A']['a':'c']) # 读取A列a到c行数据,行标签名可以用切片,左右均包含
print(df['A'][0:3]) # 读取A列第一到三行数据,左开右闭
print(df['A'][[0, 3]]) # 读取A列第一、三行数据
print(df[['A', 'D']]['a']) # KeyError: 'a',不能读取多列单行
print(df[['A', 'D']][0]) # KeyError: 0,不能读取多列单行
print(df['A':'B'][0:3]) # 返回空DataFrame,列标签名不能使用切片
print(df1[0:3][0:4]) # 读取第一到三行数据,第二个[]无效
逗号分割行标签和列标签。
定义了行或列标签名时,只能用标签名。
未定义行或列标签名时,用序列号。
列标签缺省时,读取整行数据,行标签不能缺省。
行/列标签均可以用列表和切片读取选定范围内的数据。
使用切片时,无论是标签名切片还是序列号切片都是左右均包含。
继续使用上面的两个DataFrame数据进行代码示例。
print(df1.loc[0]) # 读取整行数据
print(df.loc['a']) # 读取整行数据
print(df.loc[['a', 'c', 'b']]) # 用列表读取多行数据,行顺序按列表顺序重排
print(df.loc[['a', 'c'], ['A', 'B']]) # 用列表读取选定范围内的数据
print(df.loc['a':'c', ['A', 'B']]) # 用标签名切片和列表读取选定范围内的数据
print(df.loc['a':'c', 'A':'B']) # 可以用标签名切片读取选定范围内的数据,左右均包含。
print(df.loc['c':'a':-2, 'A':'B']) # 切片可以设定步长。
print(df1.loc[0:2, 1:3]) # 用序列号切片同样是左右均包含。
逗号分割行序列和列序列,只能使用序列号,不能使用标签名。
用法与DataFrame.loc[行标签,列标签]类似。
切片遵循左开右闭原则,与DataFrame.loc的切片取值不同,需要加强注意。
print(df.iloc[0:2, 1:3]) # 切片左开右闭
pandas版本0.20.0以后弃用,不再进行学习。