DataFrame的loc,iloc访问方式

DataFrame的loc,iloc访问方式

  1. 准备数据

准备数据meal_order_detail1.csv,并将meal_order_detail1.csv放到Linux本地/course/DataAnalyze/data目录。

  1. DataFrame的loc,iloc访问方式
  1. 使用loc方法和iloc分别实现单列切片如代码 410所示。

代码 410 loc和iloc单列切

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

  1. 使用loc方法和iloc实现多列切片,其原理的通俗解释就是将多列的列名或者位置作为一个列表或者数据传入,如代码 411所示。

代码 411 loc,iloc多列切

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

  1. 使用loc,iloc方法可以取出DataFrame中的任意数据,如代码 412所示。

代码 412 loc,iloc花式切片

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

  1. 从代码 412运行结果中可以看出在loc使用的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间;iloc方法使用时内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
  2. loc内部还可以传入表达式,结果会返回满足表达式的所有值,如代码 413所示。

代码 413 loc和iloc条件切片

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

  1. 在此处iloc方法则不能接收表达式,原因在于此处条件返回的为一个布尔值Series,而iloc可以接收的数据类型并不包括Series。根据Series的构成只要取出该Series的values就可以了,如代码 414所示。

代码 414 iloc条件切片

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              白饭/大碗

  1. 总体来说,loc更加灵活多变,代码 的可读性更高,iloc的代码 简洁,但可读性不高。具体在数据分析工作中使用哪一种方法,根据情况而定,大多数时候建议使用loc方法。
  2. 切片方法之ix:使用ix方法时有个注意事项,第一条,当索引名称和位置存在部分重叠时,ix默认优先识别名称,如代码 415所示。

代码 415 loc,iloc,ix切片比较

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值