pandas的iloc、loc、.at、.iat区别
时间: 2024-10-08 13:17:59 浏览: 77
Pandas库中的`loc`、`iloc`、`.at`和`.iat`用于数据框(DataFrame)的索引操作,它们之间的主要区别在于所使用的索引类型:
1. **loc** (label-based indexing): 这种方式基于标签(即行和列的名字)。当你想要根据行名或列名选择数据时,应该使用`loc`。例如,要选取所有姓‘张’的学生的成绩:
```python
df.loc[df['姓名'] == '张三', '成绩']
```
2. **iloc** (integer-location based indexing): 这是基于位置的索引,使用的是整数下标。它适用于直接通过数字来访问行和列。比如,选取前两行的所有数据:
```python
df.iloc[:2, :]
```
注意,这里的冒号表示从开始到结束,包括开头但不包括结尾。
3. **.at** 和 **.iat**: 这两个方法主要用于单元素的定位。`.at`用于精确匹配,如果列名存在重复,则会引发错误;而`.iat`则使用整数下标,不会检查名称是否存在。例如,获取张三的成绩(假设列名无重复):
```python
df.at[df.index.get_loc('张三'), '成绩']
```
或者使用`.iat`:
```python
df.iat[df.columns.get_loc('成绩'), df.index.get_loc('张三')]
```
相关问题
详解pandas dataframe的查询方法(loc,iloc,at,iat,ix的用法和区别
pandas是一个强大的数据分析工具,在数据处理过程中,我们经常需要对DataFrame进行查询操作。Pandas提供了多种查询方法,包括loc、iloc、at、iat和ix。以下是对这些方法的详细解释和区别。
1. loc:loc是通过行标签和列标签进行查询的方法。例如,可以使用df.loc[row_index, column_name]的方式来查询DataFrame的特定值或行列的子集。其中row_index可以是单个索引、索引列表或布尔数组,column_name可以是单个列名或列名列表。loc方法返回的是一个新的DataFrame或Series对象,以便进行进一步的操作。
2. iloc:iloc是通过行索引和列索引进行查询的方法。它与loc的用法类似,但是不是使用标签,而是使用整数位置来定位数据。例如,可以使用df.iloc[row_index, column_index]的方式来查询DataFrame的特定值或行列的子集。同样地,iloc方法返回的也是一个新的DataFrame或Series对象。
3. at:at用于直接查询DataFrame中的单个元素,它使用行标签和列标签来定位。例如,可以使用df.at[row_label, column_label]的方式来获取特定位置的值。与loc方法相比,at方法更快,并且只返回标量值。
4. iat:iat用于通过整数位置来查询DataFrame中的单个元素。可以使用df.iat[row_index, column_index]的方式来获取特定位置的值。iat方法与at方法的区别与iloc与loc的区别相似。
5. ix:在旧版本的pandas中,ix方法用于混合标签和整数位置的查询。它可以使用标签或整数位置来定位数据,但是由于存在一些歧义和性能问题,自从pandas 0.20版本后,被推荐使用loc和iloc方法来替代ix方法。
总的来说,loc和at是通过标签进行查询的方法,iloc和iat是通过整数位置进行查询的方法。同时,loc和iloc返回的是一个新的DataFrame或Series对象,而at和iat只返回标量值。在实际使用中,根据需要选择不同的查询方法。
用pandas函数代替下列语句:data2_0_time3.loc[i,'speed_391_24']=0 data2_0_time3.loc[i,'speed_391_23']=0 data2_0_time3.loc[i,'speed_391_22']=0 k=0 for j in range(1,4): if np.isnan(data2_0_time3.iat[i-j,0])==False: data2_0_time3.loc[i,'speed_391_24']=data2_0_time3.iat[i,0]+data2_0_time3.iat[i-j,0] data2_0_time3.loc[i,'speed_391_23']=data2_0_time3.iat[i,1]+data2_0_time3.iat[i-j,1] data2_0_time3.loc[i,'speed_391_22']=data2_0_time3.iat[i,2]+data2_0_time3.iat[i-j,2] k=k+1 if np.isnan(data2_0_time3.iat[i+j,0])==False: data2_0_time3.loc[i,'speed_391_24']=data2_0_time3.iat[i,0]+data2_0_time3.iat[i+j,0] data2_0_time3.loc[i,'speed_391_23']=data2_0_time3.iat[i,1]+data2_0_time3.iat[i+j,1] data2_0_time3.loc[i,'speed_391_22']=data2_0_time3.iat[i,2]+data2_0_time3.iat[i+j,2] k=k+1 data2_0_time3.loc[i,'speed_391_24']=data2_0_time3.iat[i,0]/k data2_0_time3.loc[i,'speed_391_23']=data2_0_time3.iat[i,1]/k data2_0_time3.loc[i,'speed_391_22']=data2_0_time3.iat[i,2]/k
可以使用pandas的rolling函数来代替循环,代码如下:
data2_0_time3.loc[i,['speed_391_24','speed_391_23','speed_391_22']] = [0,0,0]
if i >= 3:
rollingdata = data2_0_time3.iloc[i-3:i,:3]
rollingdata = rollingdata.dropna()
rollingcnt = len(rollingdata)
if rollingcnt > 0:
data2_0_time3.loc[i,['speed_391_24','speed_391_23','speed_391_22']] = rollingdata.mean()
其中,rolling函数会在数据窗口中滑动,计算滑动窗口内的均值。如果数据窗口中包含NaN值,则在均值计算中除去该值。最终,使用mean函数计算每个窗口的均值,并在原始数据中更新对应的值。
阅读全文