Python笔记:df.loc[]和df.iloc[]的区别

stackoverflow原文:pandas iloc vs ix vs loc explanation; how are they different?

在pandas 0.20.0及以上版本,ix已经被lociloc取代了,因此不讨论它。

  • 前提,简单介绍一下它俩:
    loc利用index的名称,来获取想要的行(或列)。(名称导向的这个特点,使得df[df.loc['col_name'] == 'condition', 'col_name'] = value_1成立。
    具体的实际应用,可参考 代码案例 一步实现EXCEL的合并数据、数据筛选、数据透视功能

    iloc利用index的具体位置(所以它只能是整数型参数),来获取想要的行(或列)。


举个栗子来直观看一下:

import...
s = pd.Series(np.nan, index=[49, 48, 47, 46, 45, 1, 2, 3, 4, 5])
print(s)
# s如下:
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
4    NaN
5    NaN
  • 让我们用整数3来试着提数:
    – 在这里, s.iloc[:3]返回给我们的是前3行的数(因为把3当作位置信息做的处理),s.loc[:3]返回前8行得数(因为把3当作名称对象做的处理):
print(s.iloc[:3])
#结果如下:
49   NaN
48   NaN
47   NaN

print(s.loc[:3])
# 结果如下:
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
  • 如果我们试着用一个不在index里的整数,比如6会出现什么结果呢?
    – 当然s.iloc[:6]返回的是前6行的数。但是,s.loc[:6]会被挂起提示KeyError,这是因为6不是index的元素。
print(s.iloc[:6])
# 结果如下:
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN

print(s.loc[:6])
# 结果如下:
keyError: 6

根据位置和名称信息混搭的取数

还是举个例子:对于一个DaraFrame,如果我想提取c行及其之前所有的,同时属于前4列的数呢?

df = pd.DataFrame(np.nan,
                  index=list('abcde'),
                  columns=['x', 'y', 'z', 8, 9])
print(df)
# df如下:
    x   y   z   8   9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN


df_select = df.iloc[:df.index.get_loc('c') + 1, :4]
print(df_select)
# df_select如下
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

get_loc(pandas 0.24.1)是一个应用在index的工具,即“获取名称对象在index的位置(整数)”。注意,因为iloc[num_of_row_start : num_of_row_end, num_of_column_start : num_of_column_end]不包含num_of_end,所以需要 +1才能包含c行。

拓展

因此,可以利用.loc[]提取目标行 / 目标列

print(df.loc[['b', 'c']])
# 结果如下
    x   y   z   8   9
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN

print(df.loc[:, ['y', 8]])
# 结果如下
    y   8
a NaN NaN
b NaN NaN
c NaN NaN
d NaN NaN
e NaN NaN

print(df.loc[['b', 'c'], ['y', 8]])
# 结果如下
    y   8
b NaN NaN
c NaN NaN
  • 32
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值