DataFrame获取多列的索引机制
df = pd.DataFrame(
dict(zip(['id','name','age','scores'],
[,['bob','lim','judy','pandas','numpy',None,None]]))
,index=pd.date_range("2026-01-01",periods=7,freq="B")
)
df
运行:
id name
2026-01-01 1001 bob
2026-01-02 1002 lim
2026-01-05 1003 judy
2026-01-06 1004 pandas
2026-01-07 1005 numpy
2026-01-08 1006 NaN
2026-01-09 1007 NaN
df[ 'id' ]可以获取的id列字段,df[ ['id', 'name'] ]获取id和name列两列,为什么df[ 'id' : 'name' ]运行报错呢,:切片是python的内置语法,为什么运用到df['id' : 'name']会报错,机制是什么呢?
在Pandas中,DataFrame的索引(通过方括号 [ ])有特殊的含义:
[*] 如果传入单个列名(如 df['id']),则返回该列。
[*] 如果传入列名列表(如 df[['id','name']]),则返回多列。
[*] 如果传入一个切片(如 df),则相当于对行索引进行切片,返回指定行范围的数据,与列表切片类似。
所以 df[:] 本身是合法的,它会返回DataFrame的所有行(即自身的一个视图或副本)。如果你运行 df[:] 遇到了报错,可能是你的操作环境或代码上下文有其他问题,比如在链式赋值中,或是在某些函数内使用了不支持的写法。
但如果你问的是 df[:, :] 这种带逗号的写法,那就会报错。因为DataFrame的方括号索引不支持逗号分隔的多个维度(不像NumPy数组)。Pandas中多维索引需要借助 .loc 或 .iloc 方法。
总结机制:
- Python的切片语法()在DataFrame的 [ ] 操作中默认作用于行索引,这与内置列表、元组的切片语义一致。
- 要同时对行和列进行切片,应当使用 df.loc['行标签切片', '列标签切片'] 或 df.iloc[行位置切片, 列位置切片]。
- 因此,直接在 [ ] 内使用冒号切片只能获取行的子集,不能获取列的子集。若想获取所有列,可以不写列参数,例如 df.loc['2026-01-01':'2026-01-03'] 会获取指定行的所有列。
希望这个解释能帮助你理解DataFrame的索引机制。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 import pandas as pd
df = pd.DataFrame(
dict(zip(['id','name','age','scores'],
[,['bob','lim','judy','pandas','numpy',None,None]]))
,index=pd.date_range("2026-01-01",periods=7,freq="B")
)
print(df, '\n')
print(df['id'], '\n')
print(df[['id', 'name']], '\n')
# print(df['id' : 'name']) # 报错
# df['id':'name'] 里有 :,属于切片,强制检索行索引,但是行里没有 id 这个索引值
print(df['2026-01-01' : '2026-01-05']) # 行切片
# 想要对列做切片可以用 .loc[行范围,列切片] 例如:
df.loc['2026-01-01' : '2026-01-05', 'id':'name']
页:
[1]