pandas dataframe loc和iloc
参考:pandas dataframe loc and iloc
在Python的数据处理库pandas中,DataFrame是一种二维的数据结构,非常适合处理表格型或异质型数据。在处理DataFrame时,我们经常需要对数据进行索引、选择和修改。pandas提供了多种索引方式,其中最常用的就是loc和iloc。本文将详细介绍pandas DataFrame的loc和iloc的用法。
1. loc
loc是基于标签的数据选择方法,它意味着我们要传入的是列名和行名。
示例代码1
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择Name为Tom的所有行
print(df.loc[df['Name'] == 'Tom'])
Output:
示例代码2
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择Age大于19的所有行
print(df.loc[df['Age'] > 19])
Output:
示例代码3
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择Name为Tom且Age大于19的所有行
print(df.loc[(df['Name'] == 'Tom') & (df['Age'] > 19)])
Output:
示例代码4
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择第0行和第2行
print(df.loc[[0, 2]])
Output:
示例代码5
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择Name和Age列
print(df.loc[:, ['Name', 'Age']])
Output:
2. iloc
iloc是基于位置的数据选择方法,它意味着我们要传入的是行号和列号。
示例代码6
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0行
print(df.iloc[0])
Output:
示例代码7
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0列
print(df.iloc[:, 0])
Output:
示例代码8
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0行和第2行
print(df.iloc[[0, 2]])
Output:
示例代码9
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0列和第2列
print(df.iloc[:, [0, 2]])
Output:
示例代码10
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0行的第1列
print(df.iloc[0, 1])
Output:
3. loc和iloc的区别
loc和iloc的主要区别在于,loc是基于标签的,而iloc是基于位置的。这意味着,当我们使用loc时,我们传入的是行标签和列标签,而当我们使用iloc时,我们传入的是行号和列号。
此外,loc包含了结束标签,而iloc不包含结束位置。这意味着,如果我们使用df.loc[0:2]
,我们会得到第0行到第2行的所有行,包括第2行;而如果我们使用df.iloc[0:2]
,我们会得到第0行和第1行,不包括第2行。
示例代码11
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择第0行到第2行
print(df.loc[0:2])
Output:
示例代码12
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择第0行到第2行
print(df.iloc[0:2])
Output:
4. loc和iloc的使用场景
在实际使用中,我们通常会根据具体的需求来选择使用loc还是iloc。
如果我们知道行标签和列标签,或者我们需要通过条件(如某列的值大于0)来选择数据,那么我们可以使用loc。如果我们知道行号和列号,或者我们需要选择某个范围内的数据(如前10行或者后5列),那么我们可以使用iloc。
示例代码13
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc选择Name为Tom的所有行的Email
print(df.loc[df['Name'] == 'Tom', 'Email'])
Output:
示例代码14
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc选择前3行的前2列
print(df.iloc[0:3, 0:2])
Output:
5. loc和iloc的注意事项
在使用loc和iloc时,我们需要注意以下几点:
- loc和iloc都是只读的,也就是说,我们不能通过loc和iloc来修改DataFrame的结构(如添加或删除行列)。但是,我们可以通过loc和iloc来修改DataFrame的值。
-
如果我们传入的标签或位置不存在,loc和iloc会抛出错误。因此,我们在使用loc和iloc时,最好先确认我们传入的标签或位置是否存在。
-
在使用条件选择时,我们需要确保条件的长度和DataFrame的行数相同。否则,pandas会抛出错误。
示例代码15
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用loc修改Name为Tom的所有行的Age
df.loc[df['Name'] == 'Tom', 'Age'] = 22
print(df)
Output:
示例代码16
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'Email': ['tom@pandasdataframe.com', 'nick@pandasdataframe.com', 'john@pandasdataframe.com', 'tom2@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用iloc修改第0行的第1列
df.iloc[0, 1] = 22
print(df)
Output:
6. 结论
总的来说,pandas的loc和iloc都是非常强大的数据选择工具,它们可以帮助我们方便地选择和修改数据。在实际使用中,我们可以根据具体的需求和场景,灵活地选择使用loc还是iloc。