Pandas DataFrame标签切片索引异常:部分操作无值返回的疑问
Pandas DataFrame标签切片问题解析
测试代码
import pandas as pd area = pd.Series({'California': 423967, 'Texas': 695662, 'Florida': 170312, 'New York': 141297, 'Pennsylvania': 119280}) pop = pd.Series({'California': 39538223, 'Texas': 29145505, 'Florida': 21538187, 'New York': 20201249, 'Pennsylvania': 13002700}) data = pd.DataFrame({'area':area, 'pop':pop}) data['density'] = data.pop / data.area
问题现象
- 执行
data['Florida':'New York']['pop':'area']或data['Florida':'New York']['area':]:仅显示列名,无对应数据值 - 执行
data['Florida':'New York'][:'area']:正常返回Florida和New York两行的所有列数据
原因解析
1. DataFrame方括号[]的作用逻辑
DataFrame的[]操作有明确分工:
- 传入单个列名/列名列表:选择列
- 传入切片对象(如
'x':'y'):仅作用于行索引,按行标签选择行区间
你写的链式索引中,第二个[]里的切片语法(比如'pop':'area'),本质是对前一步得到的子DataFrame(行是Florida、New York)做行切片,而非你以为的列切片。
2. 为什么'pop':'area'和'area':返回空数据?
子DataFrame的行索引是Florida和New York,而pop、area是列名,根本不是行索引的标签。Pandas找不到匹配的行,所以返回空DataFrame(列保留原有的,但无行数据)。
3. 为什么[:'area']能返回正常数据?
同样,[:'area']是在做行切片:行索引Florida和New York的字典序都大于字符串'area',但部分旧版本Pandas在处理不存在的切片边界时,会返回所有行(兼容逻辑导致的巧合),所以你看到了两行完整数据。这并非正确的列切片写法。
正确的列切片写法
如果要对列做标签切片,必须用.loc明确指定行和列的范围,比如:
# 切Florida到New York的行,以及area到pop的列 data.loc['Florida':'New York', 'area':'pop'] # 切Florida到New York的行,以及从area开始到最后的列 data.loc['Florida':'New York', 'area':]
内容的提问来源于stack exchange,提问作者Sara Aljazzar
相关产品推荐
相关产品推荐

