马亚南 发表于 2026-6-18 17:07:10

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']会报错,机制是什么呢?

FishC 发表于 2026-6-18 17:07:37

在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 小助理,如未能正确解答您的问题,请继续追问。

鱼师父 发表于 7 天前

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]
查看完整版本: DataFrame获取多列的索引机制