搜索

查看: 3092|回复: 11

[Python] Pandas通过index选择并获取行和列

[复制链接]
发表于 2023-5-4 17:22:03 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:22:03 3092 11 看全部
目录
  • 获取pandas.DataFrame的列
  • 列名称:将单个列作为pandas.Series获得
  • 列名称的列表:将单个或多个列作为pandas.DataFrame获得
  • 获取pandas.DataFrame的行
  • 行名・行号的切片:将单行或多行作为pandas.DataFrame获得
  • 获取pandas.Series的值
  • 标签名称:获取每种类型的单个元素的值
  • 标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
  • 获取pandas.DataFrame元素的值
  • 行名/列名是整数值时的注意事项通过指定pandas.DataFrame和pandas.Series的index(下标),可以选择和获取行/列或元素的值。根据[]中指定的值的类型,可以获取的数据会有所不同。
    将描述以下内容。
    获取pandas.DataFrame的列
  • 列名称:将单个列作为pandas.Series获得
  • 列名称的列表:将单个或多个列作为pandas.DataFrame获得
    获取pandas.DataFrame的行
  • 行名・行号的切片:将单行或多行作为pandas.DataFrame获得
    获取pandas.Series的值
  • 标签名称:获取每种类型的单个元素的值
  • 标签名称/编号列表:将单个或多个元素的值作为pandas.Series获得
  • 标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
    获取pandas.DataFrame元素的值
    行名/列名是整数值时的注意事项
    在pandas.DataFrame的情况下,如果您不习惯该规范,则会感到困惑,例如,获取列作为列表,获取行作为切片。通过使用at,iat,loc和iloc,可以更清楚地选择范围。您还可以使用pandas.DataFrame,切片列提取元素值,并按行名/行号或列表选择行。
    请参阅以下文章。
    Pandas获取和修改任意位置的值(at,iat,loc,iloc)
    在此示例代码中,read_csv读取并使用以下csv数据。
    import pandas as pd
    df = pd.read_csv('./data/28/sample_pandas_normal.csv', index_col=0)
    print(df)
    #          age state  point
    # name
    # Alice     24    NY     64
    # Bob       42    CA     92
    # Charlie   18    CA     70
    # Dave      68    TX     70
    # Ellen     24    CA     88
    # Frank     30    NY     57
    还可以使用set_index()将现有的DataFrame列指定为索引。
    Pandas.DataFrame,重置列的行名(set_index)

    获取pandas.DataFrame的列
    列名称:将单个列作为pandas.Series获得
    如果仅在[]中指定列名(列标签),则将提取所选列并将其作为pandas.Series获取。
    print(df['age'])
    print(type(df['age']))
    # name
    # Alice      24
    # Bob        42
    # Charlie    18
    # Dave       68
    # Ellen      24
    # Frank      30
    # Name: age, dtype: int64
    #
    print(df.age)
    print(type(df.age))
    # name
    # Alice      24
    # Bob        42
    # Charlie    18
    # Dave       68
    # Ellen      24
    # Frank      30
    # Name: age, dtype: int64
    #
    列名称的列表:将单个或多个列作为pandas.DataFrame获得
    如果指定列名列表,则将提取选定的多个列并将其检索为pandas.DataFrame。
    print(df[['age', 'point']])
    print(type(df[['age', 'point']]))
    #          age  point
    # name               
    # Alice     24     64
    # Bob       42     92
    # Charlie   18     70
    # Dave      68     70
    # Ellen     24     88
    # Frank     30     57
    #
    即使在具有一个元素的列表的情况下,它也成为pandas.DataFrame的一列。不是pandas.Series。
    print(df[['age']])
    print(type(df[['age']]))
    #          age
    # name        
    # Alice     24
    # Bob       42
    # Charlie   18
    # Dave      68
    # Ellen     24
    # Frank     30
    #
    如果是切片,它将是一个空的pandas.DataFrame。因为切片被视为行规范(请参见下文)。
    print(df['age':'point'])
    # Empty DataFrame
    # Columns: [age, state, point]
    # Index: []
    也可以使用loc进行列切片。另外,如果使用iloc,则可以按列号而不是列名(列标签)指定。有关详细信息,请参见以下文章。
    Pandas获取和修改任意位置的值(at,iat,loc,iloc
    print(df.loc[:, 'age':'point'])
    print(type(df.loc[:, 'age':'point']))
    #          age state  point
    # name                     
    # Alice     24    NY     64
    # Bob       42    CA     92
    # Charlie   18    CA     70
    # Dave      68    TX     70
    # Ellen     24    CA     88
    # Frank     30    NY     57
    #
    print(df.iloc[:, [0, 2]])
    print(type(df.iloc[:, [0, 2]]))
    #          age  point
    # name               
    # Alice     24     64
    # Bob       42     92
    # Charlie   18     70
    # Dave      68     70
    # Ellen     24     88
    # Frank     30     57
    #
    获取pandas.DataFrame的行
    行名・行号的切片:将单行或多行作为pandas.DataFrame获得
    如果在[]中指定切片,则可以提取并获取相应范围内的多行作为pandas.DataFrame。
    print(df[1:4])
    print(type(df[1:4]))
    #          age state  point
    # name                     
    # Bob       42    CA     92
    # Charlie   18    CA     70
    # Dave      68    TX     70
    #
    可以指定一个负值或指定一个步骤,例如start:stop:step。您可以提取并获得奇数或偶数行。
    print(df[:-3])
    print(type(df[1:-3]))
    #          age state  point
    # name                     
    # Alice     24    NY     64
    # Bob       42    CA     92
    # Charlie   18    CA     70
    #
    print(df[::2])
    print(type(df[::2]))
    #          age state  point
    # name                     
    # Alice     24    NY     64
    # Charlie   18    CA     70
    # Ellen     24    CA     88
    #
    print(df[1::2])
    print(type(df[1::2]))
    #        age state  point
    # name                  
    # Bob     42    CA     92
    # Dave    68    TX     70
    # Frank   30    NY     57
    #
    如果它不是切片,则它是无用的;如果直接指定行号,则会发生错误。
    # print(df[1])
    # KeyError: 1
    即使只选择了一行,您也可以获得pandas.DataFrame。它不会成为pandas.Series。
    print(df[1:2])
    print(type(df[1:2]))
    #       age state  point
    # name                  
    # Bob    42    CA     92
    #
    print(df['Bob':'Ellen'])
    print(type(df['Bob':'Ellen']))
    #          age state  point
    # name                     
    # Bob       42    CA     92
    # Charlie   18    CA     70
    # Dave      68    TX     70
    # Ellen     24    CA     88
    #
    如果使用loc或iloc,则可以为一行单独指定行名和行号,并将其获取为pandas.Series,也可以在列表中选择多行。
    print(df.loc['Bob'])
    print(type(df.loc['Bob']))
    # age      42
    # state    CA
    # point    92
    # Name: Bob, dtype: object
    #
    print(df.loc[['Bob', 'Ellen']])
    print(type(df.loc[['Bob', 'Ellen']]))
    #        age state  point
    # name                  
    # Bob     42    CA     92
    # Ellen   24    CA     88
    #
    print(df.iloc[[1, 4]])
    print(type(df.iloc[[1, 4]]))
    #        age state  point
    # name                  
    # Bob     42    CA     92
    # Ellen   24    CA     88
    #
    获取pandas.Series的值
    以以下pandas.Series为例。
    s = df['age']
    print(s)
    # name
    # Alice      24
    # Bob        42
    # Charlie    18
    # Dave       68
    # Ellen      24
    # Frank      30
    # Name: age, dtype: int64

    标签名称:获取每种类型的单个元素的值
    如果标签名称/编号是独立指定的,则可以按原样获得该值。如果是数字,则可以从末尾开始使用负值指定位置。 -1是结尾(最后一个)。
    也可以在后面指定标签名称,就像pandas.DataFrame的列名称规范一样。但是,请注意,如果列名与现有方法名或属性名重叠,则将优先使用。
    print(s[3])
    print(type(s[3]))
    # 68
    #
    print(s['Dave'])
    print(type(s['Dave']))
    # 68
    #
    print(s[-1])
    print(type(s[-1]))
    # 30
    #
    print(s.Dave)
    print(type(s.Dave))
    # 68
    #
    标签名称/编号列表:将单个或多个元素的值作为pandas.Series获得
    在列表的情况下,可以将多个选定的值作为pandas.Series获得。
    print(s[[1, 3]])
    print(type(s[[1, 3]]))
    # name
    # Bob     42
    # Dave    68
    # Name: age, dtype: int64
    #
    print(s[['Bob', 'Dave']])
    print(type(s[['Bob', 'Dave']]))
    # name
    # Bob     42
    # Dave    68
    # Name: age, dtype: int64
    #
    对于具有1个元素的列表,它是pandas.Series,具有1个元素,而不是元素本身。
    print(s[[1]])
    print(type(s[[1]]))
    # name
    # Bob    42
    # Name: age, dtype: int64
    #
    print(s[['Bob']])
    print(type(s[['Bob']]))
    # name
    # Bob    42
    # Name: age, dtype: int64
    #
    标签名称/数字切片:将单个元素或多个元素的值作为pandas.Series获得
    在切片的情况下,可以将多个选定值作为pandas.Series获得。如果是标签名称的一部分,则还会选择停止线。
    print(s[1:3])
    print(type(s[1:3]))
    # name
    # Bob        42
    # Charlie    18
    # Name: age, dtype: int64
    #
    print(s['Bob':'Dave'])
    print(type(s['Bob':'Dave']))
    # name
    # Bob        42
    # Charlie    18
    # Dave       68
    # Name: age, dtype: int64
    #
    当选择一个元件,它变得与pandas.Series一种元素。
    print(s[1:2])
    print(type(s[1:2]))
    # name
    # Bob    42
    # Name: age, dtype: int64
    #
    print(s['Bob':'Bob'])
    print(type(s['Bob':'Bob']))
    # name
    # Bob    42
    # Name: age, dtype: int64
    #
    获取pandas.DataFrame元素的值
    通过从pandas.DataFrame中提取pandas.Series,然后从该pandas.Series中选择并获取值,可以从pandas.DataFrame中获取元素值。
    print(df['age']['Alice'])
    # 24
    还可以组合切片和列表以提取任何范围。
    print(df['Bob':'Dave'][['age', 'point']])
    #          age  point
    # name               
    # Bob       42     92
    # Charlie   18     70
    # Dave      68     70
    但是,这种重复索引引用([…])的方法称为链式索引,因此不建议使用,因为在为选择分配值时可能发生SettingWithCopyWarning。 …
    可以使用at,iat,loc和iloc一次指定行和列。这是优选的。
    print(df.at['Alice', 'age'])
    # 24
    print(df.loc['Bob':'Dave', ['age', 'point']])
    #          age  point
    # name               
    # Bob       42     92
    # Charlie   18     70
    # Dave      68     70
    行名/列名是整数值时的注意事项
    在到目前为止的示例中,行名/列名是字符串,但是当行名/列名是整数值时要小心。
    以下面的pandas.DataFrame为例。
    df = pd.DataFrame([[0, 10, 20], [30, 40, 50], [60, 70, 80]],
                      index=[2, 0, 1], columns=[1, 2, 0])
    print(df)
    #     1   2   0
    # 2   0  10  20
    # 0  30  40  50
    # 1  60  70  80
    在[标量值]和[列表]的情况下,指定的值被视为列名。
    print(df[0])
    # 2    20
    # 0    50
    # 1    80
    # Name: 0, dtype: int64
    print(df[[0, 2]])
    #     0   2
    # 2  20  10
    # 0  50  40
    # 1  80  70
    对于“切片”,将指定的值视为行号,而不是行名。负值也可以使用。 打印(df [:2])
    print(df[:2])
    #     1   2   0
    # 2   0  10  20
    # 0  30  40  50
    print(df[-2:])
    #     1   2   0
    # 0  30  40  50
    # 1  60  70  80
    使用loc(行名)iloc(行号)来明确指定它是行名还是行号。
    print(df.loc[:2])
    #    1   2   0
    # 2  0  10  20
    print(df.iloc[:2])
    #     1   2   0
    # 2   0  10  20
    # 0  30  40  50
    s = df[2]
    print(s)
    # 2    10
    # 0    40
    # 1    70
    # Name: 2, dtype: int64
    pandas.Series认为指定的值是标签名称而不是数字。
    print(s[0])
    # 40
    使用at和iat可以清楚地指定标签名称或编号。 loc和iloc很好,但是at和iat更快。
    print(s.at[0])
    # 40
    print(s.iat[0])
    # 10
    特别要注意的是,如果尝试获取最后一个值并尝试获取[-1],它将被视为对名为-1的标签的值的选择。确定,如果您使用iat。
    # print(s[-1])
    # KeyError: -1
    print(s.iat[-1])
    # 70
    这样,当行名和列名是整数值时,最好使用at,iat,loc和iloc以避免混淆。
    到此这篇关于Pandas通过index选择并获取行和列的文章就介绍到这了,更多相关Pandas index获取行和列内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 20:08:37 | 显示全部楼层
    贰十岁装成熟装s 2023-6-28 20:08:37 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-28 22:56:17 | 显示全部楼层
    123456819 2023-6-28 22:56:17 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 14:05:56 | 显示全部楼层
    掌舵的鱼1987 2023-6-29 14:05:56 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 15:33:36 | 显示全部楼层
    惜颜705 2023-6-29 15:33:36 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 00:32:32 | 显示全部楼层
    123456809 2023-6-30 00:32:32 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 05:30:22 | 显示全部楼层
    素色流年783 2023-6-30 05:30:22 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 17:18:59 | 显示全部楼层
    塞翁364 2023-6-30 17:18:59 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 19:42:56 | 显示全部楼层
    米老鼠和蓝精鼠v 2023-6-30 19:42:56 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 09:10:54 | 显示全部楼层
    风来时狂放 2023-7-3 09:10:54 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表