pandas中loc、iloc、at、iat的区别

发布于:2024-04-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

 废话不多说,直接上代码

import pandas as pd

if __name__ == "__main__":

    data = [["lucy", "female", 17], ["lilei", "male", 18],["hanmeimei", "female", 17],["lily", "female", 16]]
    index = ['a', 'b','c','d']
    columns = ['name', 'sex', 'age']
    df = pd.DataFrame(data=data, index=index, columns=columns)
    print("*" * 10,"获取所有数据","*" * 10)
    print(df.loc[:])
    print("*" * 10,"获取第一行数据","*" * 10)
    print(df.loc["a",:])
    print("*" * 10,"获取第一行,第二列数据","*" * 10)
    print(df.loc["a","sex"])
    print("*" * 10,"获取前两行,前两列数据","*" * 10)
    print(df.loc[:"b",:"sex"])
    print("*" * 10,"获取第一、三行,第一、三列列数据","*" * 10)
    print(df.loc[['a','c'],['name','age']])
    # print(df.loc[1,2]) #报错:KeyError:
    print("*" * 20, "iloc", "*" * 20)
    print("*" * 10, "获取所有数据", "*" * 10)
    print(df.iloc[:])
    print("*" * 10, "获取第一行数据", "*" * 10)
    print(df.iloc[0, :])
    print("*" * 10, "获取第一行,第二列数据", "*" * 10)
    print(df.iloc[0, 2])
    print("*" * 10, "获取前两行,前两列数据", "*" * 10)
    print(df.iloc[:2, :2])
    print("*" * 10, "获取第一、三行,第一、三列列数据", "*" * 10)
    print(df.iloc[[0, 2], [0, 2]])
    # print(df.iloc["a", "sex"]) #ValueError: Location based indexing can only have [integer, integer slice
    print("*" * 20, "at", "*" * 20)
    print("*" * 10, "获取第一行、第一列数据", "*" * 10)
    print(df.at["a","name"])
    # print(df.at["a":"c","name":]) #TypeError: unhashable type: 'slice'
    # print(df.at[1, 2]) #KeyError: 2
    print("*" * 20, "iat", "*" * 20)
    print("*" * 10, "获取第一行、第一列数据", "*" * 10)
    print(df.iat[0, 0])
    print("*" * 10, "==", "*" * 10)
    # print(df.iat[0:2, 0]) #ValueError: iAt based indexing can only have integer indexers
    # print(df.iat["a", "sex"]) #ValueError: iAt based indexing can only have integer indexers
    # df.ix["a":"c","name":"age"] #AttributeError: 'DataFrame' object has no attribute 'ix'

输出:

********** 获取所有数据 **********
        name     sex  age
a       lucy  female   17
b      lilei    male   18
c  hanmeimei  female   17
d       lily  female   16
********** 获取第一行数据 **********
name      lucy
sex     female
age         17
Name: a, dtype: object
********** 获取第一行,第二列数据 **********
female
********** 获取前两行,前两列数据 **********
    name     sex
a   lucy  female
b  lilei    male
********** 获取第一、三行,第一、三列列数据 **********
        name  age
a       lucy   17
c  hanmeimei   17
******************** iloc ********************
********** 获取所有数据 **********
        name     sex  age
a       lucy  female   17
b      lilei    male   18
c  hanmeimei  female   17
d       lily  female   16
********** 获取第一行数据 **********
name      lucy
sex     female
age         17
Name: a, dtype: object
********** 获取第一行,第二列数据 **********
17
********** 获取前两行,前两列数据 **********
    name     sex
a   lucy  female
b  lilei    male
********** 获取第一、三行,第一、三列列数据 **********
        name  age
a       lucy   17
c  hanmeimei   17
******************** at ********************
********** 获取第一行、第一列数据 **********
lucy
******************** iat ********************
********** 获取第一行、第一列数据 **********
lucy
********** == **********

综上可以总结出它们的区别:

  • loc:只能通过行索引和列索引名称获取单行单列,或者多行多列数据;
  • iloc:只能通过行序号和列序号获取单行单列,或者多行多列数据;
  • at:只能通过行索引和列索引名称获取单行单列数据,不能获取多行多列数据;
  • iat:只能通过行序号和列序号获取单行单列数据,不能获取多行、多列数据;
  • ix:从pandas 0.20.0版开始,ix已被彻底移除;