我学pandas,就没搞明白过取值,一会儿好像这样一会儿好像这样,头疼的很,今天彻底的理解了一遍,做个笔记,希望也能帮到头疼的你。
先建立一个数据源,好慢慢理解。
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True) # 解决运行后行列显示不对齐的问题
data = [[130, 117, 106, 101], [112, 106, 142, 79], [136, 101, 85, 132], [126, 91, 95, 127], [139, 109, 99, 121]]
index_name = ['王宽', '黄蓉', '展昭', '雅雅', '红红']
columns = ['数学', '英文', '物理', '语文']
df = pd.DataFrame(data=data, columns=columns, index=index_name)
print(df, '\n--------------------------------')
先看看这几点,有助于你后面更好的理解,如果列举的代码看的累,可以看看最后的表格列举。
1、【无论是 行 还是 列,pandas的索引号是从0开始】
2、loc 方法
- 以 列名(columns) 和 行名(index)作为参数
- 当只有一个参数时,默认是 行名(index),即抽取整行数据,包括所有列
- 例如 df.loc['展昭'],抽取的就是'展昭'一行包括所有列的数据
3、iloc 方法:
- 以 行 和 列 其位置索引(即 0,1,2,3, ...)作为参数,0 表示第一行,1 表示第二行,2 表示第三行,以此类推。
- 当只有一个参数时,默认是 行索引,即抽取整行数据,包括所有列
- 例如 df.iloc[0],抽取的就是第1行包括所有列的数据
※ a_1. 行操作:【抽取 一行】
# '展昭'行
print(df.loc['展昭'])
# 第2行 ,(即 展昭 那一行)
print(df.iloc[2])
※ a_2. 行操作:【抽取 多行-指定行】
# '王宽' 和 '展昭' ,2行
print(df.loc[['王宽', '展昭']])
第1行 和 第2行, 2行
print(df.iloc[[0, 2]])
※ a_3. 行操作:【抽取 多行-连续行】
print(df.loc['王宽':'展昭']) # 从 '王宽'行 到 '展昭'行
print(df.loc[:'雅雅':]) # 从 第1行 到 '雅雅'行
print(df.iloc[0:2]) # 从 第1行 到 第2行 ;(左开右闭原则,取到第3行但不包含第3行)
print(df.iloc[2::]) # 从 第3行 到 最后1行
※ b_1. 列操作:【抽取 多列-指定列】取一列的话就写一个列索引名或列索引号
print(df[['英文', '语文']]) # '英语'列 和 '语文'列 2列
print(df.loc[:, ['英文', '语文']]) # '英语'列 和 '语文'列 2列
print(df.iloc[:, [0, 1]]) # 第1列 和 第2列 2列;(无左开右闭原则,指定几列取几列)
※ b_2. 列操作:【抽取 多列-连续列】
print(df.loc[:, '英文':]) # 从 '英文'列 到 最后1列
print(df.iloc[:, :3]) # 从 第1列 到 第3列 (左开右闭原则,取到第4列但不包含第4列)
※ c_1. 行列操作:【抽取 多行多列-指定的行列】
作者:Mae土豆
链接:https://www.zhihu.com/question/506727647/answer/2772916369
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
print(df.loc['王宽', '语文']) # '王宽' 的 '语文' 成绩值,(即 访问某一单元格的值),【不是 DataFrame 对象数据】
print(df.loc[['王宽'], ['语文']]) # '王宽'行 的 '语文'列 的数据 ,即 '王宽' 的 '语文' 成绩,
print(df.loc[['王宽'], ['数学', '语文']]) # '王宽'行 的 '数学'列 和'语文'列 的数据
print(df.iloc[1, 2]) # 第2行 的 第3列 的值,(即 访问某一单元格的值),【不是 DataFrame 对象数据】
print(df.iloc[[1], [2]]) # 第2行 的 第3列 的数据,(带有 行 列 索引,所以是 DataFrame 对象的数据)
print(df.iloc[1:, [2]]) # 从 第2行开始到最后1行 的 第3列 的数据,(或反过来理解,取 第3列的,第2行开始到最后1行的数据)
print(df.iloc[1:, [0, 2]]) # 从 第2行开始到最后1行 的 第1列 和 第3列 的数据,(或反过来理解,取 第1列 和 第3列的,第2行开始到最后1行的数据)
print(df.iloc[:, 3]) # 所有行 的 第4列 的数据,(或反过来理解,取 第14列的,所有行的数据)
简化式成表格表,再次强调,【无论是 行 还是 列,pandas的索引号是从0开始】
所以,数据中,从'王宽'的索引行号是0,'数学'的索引列号是0,(我们自己会常说是第1行,第1列)