loc函数
:通过
行索引
“Index” 中的具体值来取行数据(如取”Index”为”A”的行)
iloc函数:
通过
行号
来取行数据(如取第二行的数据)
1. 利用loc、iloc提取行数据
import numpy as np
import pandas as pd
#创建一个Dataframe
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
In[1]: data
Out[1]:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
#取索引为'a'的行
In[2]: data.loc['a']
Out[2]:
A 0
B 1
C 2
D 3
#取第一行数据,索引为'a'的行就是第一行,所以结果相同
In[3]: data.iloc[0]
Out[3]:
A 0
B 1
C 2
D 3
2. 利用loc、iloc提取列数据
In[4]:data.loc[:,['A']] #取'A'列所有行,多取几列格式为 data.loc[:,['A','B']]
Out[4]:
A
a 0
b 4
c 8
d 12
In[5]:data.iloc[:,[0]] #取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
Out[5]:
A
a 0
b 4
c 8
d 12
3.利用loc、iloc提取指定行、指定列数据
In[6]:data.loc[['a','b'],['A','B']] #提取index为'a','b',列名为'A','B'中的数据
Out[6]:
A B
a 0 1
b 4 5
In[7]:data.iloc[[0,1],[0,1]] #提取第0、1行,第0、1列中的数据
Out[7]:
A B
a 0 1
b 4 5
4.利用loc、iloc提取所有数据
In[8]:data.loc[:,:] #取A,B,C,D列的所有行
Out[8]:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
In[9]:data.iloc[:,:] #取第0,1,2,3列的所有行
Out[9]:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
5.利用loc函数,根据某个数据来提取数据所在的行
In[10]: data.loc[data['A']==0] #提取data数据(筛选条件: A列中数字为0所在的行数据)
Out[10]:
A B C D
a 0 1 2 3
In[11]: data.loc[(data['A']==0)&(data['B']==1)] #提取data数据(多个筛选条件)
Out[11]:
A B C D
a 0 1 2 3
同时,以下几种写法也可提取数据所在的行,与第五种用法类似。
In[12]: data[data['A']==0] #dataframe用法
In[13]: data[data['A'].isin([0])] #isin函数
In[14]: data[(data['A']==0)&(data['B']==1)] #dataframe用法
In[15]: data[(data['A'].isin([0]))&(data['B'].isin([1]))] #isin函数
Out[15]:
A B C D
a 0 1 2 3
** 利用loc函数的时候,当index相同时,会将相同的Index全部提取出来,优点是:如果index是人名,数据框为所有人的数据,那么我可以将某个人的多条数据提取出来分析;缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理,可用.reset_index()函数重置index**
以上内容全部参考此博主的优秀文章:
https://blog.csdn.net/W_weiying/article/details/81411257
接下来是总结iloc在特殊场景下的用法:
6. DataFrame在groupby分组后提取每一组的最后一条数据
:取每个user同一subject排倒数第二得成绩
In[16]:
df = pd.DataFrame({'user': ['A', 'B', 'A','D'], 'subject': [11, 12, 11, 13], 'score': [90, 99, 89, 90]})
df
Out[16]:
user subject score
0 A 11 90
1 B 12 99
2 A 11 89
3 D 13 90
# 先按照score升序排序,再groupBy,最后用lamda函数结合iloc取倒数第二得成绩。 因为有些用户可能只有一条记录,直接取可能会出错,所以我用if先做判断,如果该分组只有一条数据就取倒数第一的成绩。
In[17]:
grouped_data = df.sort_values(by='score').groupby(['user', 'subject'])['score'].apply(lambda i:i.iloc[-2] if len(i)> 1 else i.iloc[-1])
grouped_data
Out[17]:
user subject
A 11 89
B 12 99
D 13 90
Name: score, dtype: int64
以上内容参考链接:
https://blog.csdn.net/lz_peter/article/details/79044247
版权声明:本文为qq_39657585原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。