DataFrame的loc,iloc访问方式
- 准备数据
准备数据meal_order_detail1.csv,并将meal_order_detail1.csv放到Linux本地/course/DataAnalyze/data目录。
- DataFrame的loc,iloc访问方式
- 使用loc方法和iloc分别实现单列切片如代码 410所示。
In[14]: | dishes_name1 = detail.loc[:,'dishes_name'] print('使用loc提取dishes_name列的size为:', dishes_name1.size) |
Out[14]: | 使用loc提取dishes_name列的size为: 2779 |
In[15]: | dishes_name2 = detail.iloc[:,3] print('使用iloc提取第3列的size为:', dishes_name2.size) |
Out[15]: | 使用iloc提取第3列的size为: 2779 |
- 使用loc方法和iloc实现多列切片,其原理的通俗解释就是将多列的列名或者位置作为一个列表或者数据传入,如代码 411所示。
In[16]: | orderDish1 = detail.loc[:,['order_id','dishes_name']] print('使用loc提取order_id和dishes_name列的size为:', orderDish1.size) |
Out[16]: | 使用loc提取order_id和dishes_name列的size为: 5558 |
In[17]: | orderDish2 = detail.iloc[:,[1,3]] print('使用iloc提取第1和第3列的size为:', orderDish1.size) |
Out[17]: | 使用iloc提取第1和第3列的size为: 5558 |
- 使用loc,iloc方法可以取出DataFrame中的任意数据,如代码 412所示。
In[18]: | print('列名为order_id和dishes_name的行名为3的数据为:\n', detail.loc[3,['order_id','dishes_name']]) |
Out[18]: | 列名为order_id和dishes_name的行名为3的数据为: order_id 417 dishes_name芝麻烤紫菜 Name: 3, dtype: object |
In[19]: | print('列名为order_id和dishes_name行名为2,3,4,5,6的数据为:\n', detail.loc[2:6,['order_id','dishes_name']]) |
Out[19]: | 列名为order_id和dishes_name行名为2,3,4,5,6的数据为: order_iddishes_name 2 417 大蒜苋菜 3 417 芝麻烤紫菜 4 417 蒜香包 5 301 白斩鸡 6 301 香烤牛排 |
In[20]: | print('列位置为1和3行位置为3的数据为:\n',detail.iloc[3,[1,3]]) |
Out[20]: | 列位置为1和3行位置为3的数据为: order_id 417 dishes_name NA Name: 3, dtype: object |
In[21] | print('列位置为1和3行位置为2,3,4,5,6的数据为:\n',detail.iloc[2:7,[1,3]]) |
Out[21] | 列位置为1和3行位置为2,3,4,5,6的数据为: order_idlogicprn_name 2 417 NA 3 417 NA 4 417 NA 5 301 NA 6 301 NA |
- 从代码 412运行结果中可以看出在loc使用的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间;iloc方法使用时内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
- loc内部还可以传入表达式,结果会返回满足表达式的所有值,如代码 413所示。
In[22]: | print('detail中order_id为458的dishes_name为:\n', detail.loc[detail['order_id']==458,['order_id','dishes_name']]) |
Out[22]: | detail中order_id为458的dishes_name为: order_iddishes_name 145 458 蒜香辣花甲 146 458 剁椒鱼头 147 458 凉拌蒜蓉西兰花 148 458 木须豌豆 149 458 辣炒鱿鱼 150 458 酸辣藕丁 151 458 炝炒大白菜 152 458 香菇鸡肉粥 153 458 干锅田鸡 154 458 桂圆枸杞鸽子汤 155 458 五香酱驴肉 156 458 路易拉菲红酒干红 157 458 避风塘炒蟹 158 458 白饭/大碗 |
In[23]: | print('detail中order_id为458的第1,5列数据为:\n', detail.iloc[detail['order_id']==458,[1,5]]) |
Out[23]: | NotImplementedError: iLocation based boolean indexing on an integer type is not available |
- 在此处iloc方法则不能接收表达式,原因在于此处条件返回的为一个布尔值Series,而iloc可以接收的数据类型并不包括Series。根据Series的构成只要取出该Series的values就可以了,如代码 414所示。
In[24]: | print('detail中order_id为458的第1,5列数据为:\n', detail.iloc[(detail['order_id']==458).values,[1,5]]) |
Out[24]: | detail中order_id为458的第1,5列数据为: order_iddishes_name 145 458 蒜香辣花甲 146 458 剁椒鱼头 147 458 凉拌蒜蓉西兰花 148 458 木须豌豆 149 458 辣炒鱿鱼 150 458 酸辣藕丁 151 458 炝炒大白菜 152 458 香菇鸡肉粥 153 458 干锅田鸡 154 458 桂圆枸杞鸽子汤 155 458 五香酱驴肉 156 458 路易拉菲红酒干红 157 458 避风塘炒蟹 158 458 白饭/大碗 |
- 总体来说,loc更加灵活多变,代码 的可读性更高,iloc的代码 简洁,但可读性不高。具体在数据分析工作中使用哪一种方法,根据情况而定,大多数时候建议使用loc方法。
- 切片方法之ix:使用ix方法时有个注意事项,第一条,当索引名称和位置存在部分重叠时,ix默认优先识别名称,如代码 415所示。
In[25]: | print('列名为dishes_name行名为2,3,4,5,6的数据为:\n',detail.loc[2:6,'dishes_name']) |
Out[25]: | 列名为dishes_name行名为2,3,4,5,6的数据为: 2 大蒜苋菜 3 芝麻烤紫菜 4 蒜香包 5 白斩鸡 6 香烤牛排 Name: dishes_name, dtype: object |
In[26]: | print('列位置为5,行位置为2至6的数据为:\n',detail.iloc[2:6,5]) |
Out[26]: | 列位置为5,行位置为2至6的数据为: 2 大蒜苋菜 3 芝麻烤紫菜 4 蒜香包 5 白斩鸡 Name: dishes_name, dtype: object |
In[27]: | print('列位置为5行名为2至6的数据为:', '\n',detail.ix[2:6,5]) |
Out[27]: | 列位置为5行名为2至6的数据为: 2 大蒜苋菜 3 芝麻烤紫菜 4 蒜香包 5 白斩鸡 6 香烤牛排 Name: dishes_name, dtype: object |