[Pandas] DataFrame.loc
描述
DataFrame.loc
主要是基于标签的索引方式,但也可以使用布尔数组进行索引。
- 单个标签,例如 5 或 'a'(注意 5 被解释为索引的标签,并不是索引中的整数位置)。
- 标签的列表或数组,例如 ['a', 'b', 'c']。
- 使用标签的切片对象,例如 '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
"""