Pandas DataFrame对象索引及常见错误写法

本文详细介绍了Python Pandas库中DataFrame对象的多种索引方法,包括中括号索引、loc/iloc索引及布尔索引的特点和使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fPython语言Pandas库的DataFrames数据类型的索引写法比较多,既提供了方便也容易出错。一般的Python书籍上对Pandas索引都有介绍,本文总结一些个人体会,大体分为用中括号索引和用loc/iloc[]索引。

先生成一个DataFrame对象为例:

df=pd.DataFrame(np.random.rand(4,4), index=list('abcd'), columns=list('ABCD'))

ABCD
a0.9592450.5522850.2659930.249411
b0.7438800.5826830.3109400.675503
c0.6442870.7962470.2023140.232712
d0.1494950.5702650.0953890.029824

1. 用中括号的索引

在用中括号索引时最容易犯错的是混淆了行索引和列索引。基本原则如下:

(1)单值索引只能索引列
df['A']是正确的写法,等同于df.A。如果想索引某一行,不能写成df['a']或df['a',:],否则会报错。但可以改用df[df.index=='a']或者df.loc['a']的形式。当需要创建一列时只能用df['列名']的形式。

(2)列表索引也只能索引列

如果想同时索引多列,可以写成df[['A','B']],记住有两层中括号,不能少一层中括号。如果写成df['A','B']会报错,因为逗号被解释成了维度之间的分隔符。这里行索引只有'a',而没有'A',而且要表示'a'行'B'列应该用df.loc['a','B'],不能少了loc。列表索引可以改变索引列的顺序,例如写成df[['C','B','A']]将按C、BA的顺序显示,这叫花式索引。

(3)切片只能索引多行
切片索引写成df['a':'c']或df[:2]表示索引a到c三行,但不能写成df['A':'C']或df[:,'A':'C']来索引三列。这点跟numpy的array不同,如果df是ndarray类型的,可以用df[:, 1:3]来切片第1~2列。要想切片多列可以写成df.loc[:,'A':'C'],但这里不能少了loc和:,,否则也报错。另外,切片只能用中括号或loc索引,而不能写成对象属性的形式,df.loc[:, df.A:df.C]也会报错。
 

2. 用loc/iloc[]的索引

上面说了中括号不能对单个行进行索引,而用loc/iloc就解决了这个问题,例如df.loc['b']或df.iloc[2],所以要想索引某一行只能用loc/iloc的形式。由于loc可以索引单个行,为了不引起混淆,索引单个列时必须在前面加上符号“:,”,例如df.loc[:,'A']表示索引A列,如果写成df.loc['A']就会报错,因为Notebook会将df.loc['A']解读为df的A行而实际上df并没有A行。同样,可以用iloc[]来索引一个元素或切片,例如df.iloc[2][3]跟df.iloc[2,3]是等价的,都得到0.232712。df.iloc[2][3]相当于先从df中取出df.iloc[2]这一行,再从这行中取出第3个数。同理,df.iloc[2][1:3]表示第2行的1到2切片。但博主不建议用两个方括号iloc[][]的写法,有时程序会出意外错误。

3. 关于布尔索引

(1)布尔条件索引既可以索引行又可以索引列,既可以用于中括号索引又可以用于loc/iloc索引。但我建议尽量用loc索引,尤其是对列索引操作时不容易出错,用iloc或直接用方括号索引有时会出现未知错误。如果逻辑表达式是关于变量(列)取值的,布尔索引返回的是行数据,例如写成df.loc[关于列的条件]返回的是行数据,例如df.loc[df['A']>0.5]。如果逻辑表达式是关于行索引取值的,例如写成df.loc[关于行的条件],则返回的是列数据,例如df.loc[:, df.loc['c']>0.1]。另外还需注意df.loc[df['A']>0.1]中内层的df不能漏了,如写成df[['A']>0.1]或df['A'>0.1]系统只会把'A'当成是一个字符而报错,系统不知道A是指df的一列。还有一个原因,是内侧用于逻辑判断的表跟外侧被索引的表可以不相同,即df1.loc[df2['A']>0.1]的写法,假定df1和df2不是同一个表,这里[df2['A']>0.1]返回一个df2中为True的元素位置的索引列表,然后在df1中按照同样的位置把行取出来。因此用于逻辑判断的字段就必须带上表名,否则不知道是指哪个表里的字段。如果只需要显示A列数据,不能写成df.A[df>0.1],而应该写成df.A[df.A>0.1]。

(2)当逻辑表达式是关于列名的,布尔索引可以用于对列索引,例如df.iloc[:, df.columns!='B']或df.loc[:, df.columns!='B']都能执行,但此处不能少了loc和iloc,否则也报错。总之凡是把行索引写成“:,”再写列的选取条件的形式只能用在loc/iloc格式。

(3)如果要用布尔关系将多个条件组合起来,要给每个条件加小括号,例如df.loc[(df['A']>0.7) & (df['B']<0.5) & (df['C']>0.6)],漏写小括号也会出错。注意这里的运算符是位运算符&,而不是布尔运算符and,后者也会出错。如果需要返回整个矩阵,只能用中括号索引,而不能用loc/iloc[]。例如返回df中大于0.1的值应当写成df[df>0.1],而不能写成df.loc[df>0.1]
 

### 回答1: 要设置 dataframe 的行索引,可以使用 dataframe 的 set_index 方法,具体用法如下: ``` df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) ``` 其中,keys 参数是要设置为行索引的一列或多列的名称。 例如,假设有一个 dataframe 叫做 df,我们想将列 "a" 设置为行索引,可以这样写: ``` df.set_index("a") ``` 如果需要将多列设置为行索引,可以这样写: ``` df.set_index(["a", "b"]) ``` 注意,这两种写法均会返回一个新的 dataframe,原 dataframe 不会改变。如果需要在原 dataframe 上进行修改,需要使用 inplace 参数,例如: ``` df.set_index("a", inplace=True) ``` 如果你想要了解更多关于 set_index 的用法,可以参考官方文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html 。 ### 回答2: 在Python中使用pandas库,可以通过将已有的一列或多列指定作为dataframe的行索引,实现对数据的索引和访问。 一种常见的方式是使用`set_index()`函数,该函数用于将指定列设置为行索引。例如,假设我们有一个dataframe对象df,其中包含"Name"和"Age"两列数据,我们想将"Name"列作为行索引,则可以使用以下代码实现: ```python df = df.set_index('Name') ``` 除了直接指定列名外,还可以使用数据框中某一列的序号作为行索引。例如,假设我们想使用第一列数据作为行索引,则可以使用以下代码: ```python df = df.set_index(df.columns[0]) ``` 另一种常见的方式是在创建dataframe时直接指定行索引。例如,我们可以使用pandas库中的`DataFrame()`函数创建一个dataframe对象,并在参数中指定index参数为一个列表,其中包含我们希望设置为行索引的值。具体代码如下: ```python import pandas as pd data = {'Name': ['Tom', 'Jack', 'Mary', 'David'], 'Age': [25, 30, 28, 35], 'City': ['New York', 'London', 'Paris', 'Sydney']} df = pd.DataFrame(data, index=['A', 'B', 'C', 'D']) ``` 此时,dataframe对象df将使用列表['A', 'B', 'C', 'D']作为行索引。 综上所述,我们可以通过`set_index()`函数或在创建dataframe时直接指定index参数,来设置Pythondataframe的行索引。 ### 回答3: 在Python中,我们可以使用`pandas`库来创建和操作数据框(dataframe),而设置行索引可以通过以下几种方法来实现: 1. 使用已有的一列作为行索引:可以通过设置`set_index`函数,将已有的列设置为行索引。例如,假设我们有一个数据框`df`,其中有一列叫做`ID`,我们可以使用以下代码将`ID`列设置为行索引: ```python df.set_index('ID', inplace=True) ``` 这样就会将`ID`列作为行索引2. 使用`range`函数生成行索引:可以使用`range`函数生成行索引,然后使用`index`属性将其设置给数据框。例如: ```python df.index = range(len(df)) ``` 这样就会将0到n-1的整数作为行索引,其中n是数据框的行数。 3. 自定义行索引:可以创建一个列表或数组,然后将其设置为行索引。例如: ```python custom_index = ['a', 'b', 'c'] df.index = custom_index ``` 这样就会将自定义列表`['a', 'b', 'c']`作为行索引。 需要注意的是,无论使用哪种方法设置行索引,在数据框中,行索引会以灰色的粗体显示,位于数据框的最左侧。行索引可以帮助我们更方便地查询、筛选和操作数据框中的数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值