[Pandas] DataFrame.loc

描述

DataFrame.loc 主要是基于标签的索引方式,但也可以使用布尔数组进行索引。

  1. 单个标签,例如 5 或 'a'(注意 5 被解释为索引的标签,并不是索引中的整数位置)。
  2. 标签的列表或数组,例如 ['a', 'b', 'c']。
  3. 使用标签的切片对象,例如 'a':'f'。

war:[start]注意与通常的Python切片不同,在这里开始和结束的标签都会被包含进来。与要切片的轴长度相同的布尔数组,例如 [True, False, True]
war:[end]

file:[示例数据]
df = pd.DataFrame([[1, 2, 12, 21], [4, 5, 45, 54], [7, 8, 78, 87], [9, 10, 910, 19], [11, 12, 1112, 2111]],
                  index=['cobra', 'viper', 'sidewinder', 'winter', 'water'],
                  columns=['max_speed', 'shield', 'footer', 'header'])

"""打印结果
            max_speed  shield  footer  header
cobra               1       2      12      21
viper               4       5      45      54
sidewinder          7       8      78      87
winter              9      10     910      19
water              11      12    1112    2111
"""

案例一

print(df.loc['cobra'], '\n')

"""
max_speed     1
shield        2
footer       12
header       21
Name: cobra, dtype: int64
"""

获取到一个 Series。

案例二

print(df.loc[['cobra', 'viper']], '\n')

"""
       max_speed  shield  footer  header
cobra          1       2      12      21
viper          4       5      45      54 
"""

获取到一个 DataFrame,但只有 cobra 和 viper 两行。

案例三

print(df.loc['cobra', 'max_speed'], '\n')

"""
1
"""

行和列共同锁定到一个值。

案例四

print(df.loc['cobra': 'sidewinder', 'max_speed'], '\n')
print(df.loc['cobra': 'sidewinder', ['max_speed']], '\n')
print(df.loc[['cobra', 'sidewinder'], 'max_speed': 'footer'], '\n')
print(df.loc['cobra', 'max_speed': 'shield'], '\n')
print(df.loc['cobra': 'viper', 'max_speed': 'shield'], '\n')
print(df.loc['cobra': 'viper', :], '\n')
print(df.loc[:, :], '\n')
print(df.loc[['cobra', 'viper'], ['max_speed', 'shield']], '\n')

"""
cobra         1
viper         4
sidewinder    7
Name: max_speed, dtype: int64 

            max_speed
cobra               1
viper               4
sidewinder          7 

            max_speed  shield  footer
cobra               1       2      12
sidewinder          7       8      78 

max_speed    1
shield       2
Name: cobra, dtype: int64 

       max_speed  shield
cobra          1       2
viper          4       5 

       max_speed  shield  footer  header
cobra          1       2      12      21
viper          4       5      45      54 

            max_speed  shield  footer  header
cobra               1       2      12      21
viper               4       5      45      54
sidewinder          7       8      78      87
winter              9      10     910      19
water              11      12    1112    2111


       max_speed  shield
cobra          1       2
viper          4       5 
"""

切片获取,结果可能是 Series,也可能是 DataFrame。比如第一个打印结果,是一个 Series,原因是行选取了 cobra 至 sidewinder,提供列的只是一个字符串 max_speed;又看第二个打印结果,是一个 DataFrame,提供的列是一个数组,不单是字符串,因此结果是行列二维数组。

案例五

提供一组布尔值数组,获取 DataFrame。

print(df.loc[[True, False, True, False, True]], '\n')
print(df.loc[pd.Series([True, False, True, False, True], index=['cobra', 'viper', 'sidewinder', 'winter', 'water'])],
      '\n')

"""
            max_speed  shield  footer  header
cobra               1       2      12      21
sidewinder          7       8      78      87
water              11      12    1112    2111 

            max_speed  shield  footer  header
cobra               1       2      12      21
sidewinder          7       8      78      87
water              11      12    1112    2111 
"""

以上两种方式的结果一致。

进一步,通过以下方式,获取到一组值为布尔的 Series,对列进行判断,得到一个符合条件的 DataFrame。

print(df['shield'] > 6, '\n')
print(df.loc[df['shield'] > 6], '\n')

"""
cobra         False
viper         False
sidewinder     True
winter         True
water          True
Name: shield, dtype: bool 

            max_speed  shield  footer  header
sidewinder          7       8      78      87
winter              9      10     910      19
water              11      12    1112    2111 
"""

只有 shield 的值大于 6,才可以被选中。若有多种条件,例如 |(理解为或)和 &(理解为且)。

print(df.loc[(df['shield'] > 6) | (df['header'] > 80)], '\n')
print(df.loc[(df['shield'] > 6) & (df['header'] > 80)], '\n')

"""
            max_speed  shield  footer  header
sidewinder          7       8      78      87
winter              9      10     910      19
water              11      12    1112    2111 

            max_speed  shield  footer  header
sidewinder          7       8      78      87
water              11      12    1112    2111 
"""
posted @ 2024-03-06 12:43  Himmelbleu  阅读(2)  评论(0编辑  收藏  举报