目录

一、直接用方括号[]取下标读取,DataFrame[列标签][行标签]

二、用DataFrame.loc[行标签,列标签]按照行/列标签名index读取

三、用DataFrame.iloc[行序列,列序列]按所在行/列号读取

四、DataFrame.ix[]


本人小白一枚,正在自学python,pandas模块的DataFrame数据类型是一个处理表格数据的强大工具,下面是我对读取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.loc[行标签,列标签]按照行/列标签名index读取

        逗号分割行标签和列标签。

        定义了行或列标签名时,只能用标签名。

        未定义行或列标签名时,用序列号。

        列标签缺省时,读取整行数据,行标签不能缺省。

        行/列标签均可以用列表和切片读取选定范围内的数据。

        使用切片时,无论是标签名切片还是序列号切片都是左右均包含。

继续使用上面的两个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.iloc[行序列,列序列]按所在行/列号读取

        逗号分割行序列和列序列,只能使用序列号,不能使用标签名。

        用法与DataFrame.loc[行标签,列标签]类似。

        切片遵循左开右闭原则,与DataFrame.loc的切片取值不同,需要加强注意。

print(df.iloc[0:2, 1:3])    # 切片左开右闭

四、DataFrame.ix[]

        pandas版本0.20.0以后弃用,不再进行学习。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐