Pandas-数据结构-DataFrame(五):行&列同时索引【①:df.loc[[‘b‘, ‘c‘], [‘y‘, 8]];②:先列索引,再行索引;③:df.iloc[1:3, 2:6]】

Dataframe既有行索引也有列索引,可以被看做由Series组成的字典(共用一个索引)。

一、直接索引(先列后行,直接索引时只能通过索引名进行索引,不能通过下标)

在这里插入图片描述
获取’2018-02-27’这天的’close’的结果

# 直接使用行列索引名字的方式(先列后行)
data['open']['2018-02-27']
23.53

# 不支持的操作
# 错误
data['2018-02-27']['open']
# 错误
data[:1, :2]

二、提取 “目标行 & 目标列”:df.loc[[‘b’, ‘c’], [‘y’, 8]]

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.loc[:, [‘y’, 8]]:提取第‘y’、8列的所有行;
  • df.loc[:, ‘y’:8] :错误表达;
import numpy as np
import pandas as pd

df = pd.DataFrame(np.nan,
                  index=list('abcde'),
                  columns=['x', 'y', 'z', 8, 9])
print("df = \n", df)

print("-" * 100)

data1 = df.loc[['b', 'c']]
print("data1 = \n", data1)
print("-" * 50)
data2 = df.loc[:, ['y', 8]]
print("data2 = \n", data2)
print("-" * 50)
data3 = df.loc[['b', 'c'], ['y', 8]]
print("data3 = \n", data3)

打印结果:

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
----------------------------------------------------------------------------------------------------
data1 = 
     x   y   z   8   9
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
--------------------------------------------------
data2 = 
     y   8
a NaN NaN
b NaN NaN
c NaN NaN
d NaN NaN
e NaN NaN
--------------------------------------------------
data3 = 
     y   8
b NaN NaN
c NaN NaN

Process finished with exit code 0

三、先列索引,再行索引

先选择列再选择行:相当于对于一个数据,先筛选字段,再选择数据量

import numpy as np
import pandas as pd

# 多重索引:比如同时索引行和列
# 先选择列再选择行 —— 相当于对于一个数据,先筛选字段,再选择数据量

df = pd.DataFrame(np.random.rand(16).reshape(4, 4) * 100,
                  index=['one', 'two', 'three', 'four'],
                  columns=['a', 'b', 'c', 'd'])
print("df = \n", df)
print('-' * 100)

data1 = df['a'].loc[['one', 'three']]
print("data1 = df['a'].loc[['one', 'three']] = \n", df['a'].loc[['one', 'three']])  # 选择a列的one,three行
print('-' * 50)

data2 = df[['b', 'c', 'd']]
print("data2 = df[['b', 'c', 'd']] = \n", data2)
print('-' * 100)

data = df['a'] < 50
print("data = df['a'] < 50 = \n", data)
print('-' * 50)
data3 = df[df['a'] < 50]
print("data3 = df[df['a'] < 50] = \n", data3)  # 选择b,c,d列的one,three行
print('-' * 50)

data4 = df[df['a'] < 50].iloc[1]
print("data4 = df[df['a'] < 50].iloc[:2] = \n", data4)  # 选择满足判断索引的前两行数据

打印结果:

df = 
                a          b          c          d
one     9.835341  90.198909  41.946498  57.696927
two    42.118455  92.361098  12.128027  58.962167
three  57.007146  18.977019  92.999803  47.113144
four   97.706270  99.227877   4.032991  27.748419
----------------------------------------------------------------------------------------------------
data1 = df['a'].loc[['one', 'three']] = 
 one       9.835341
three    57.007146
Name: a, dtype: float64
--------------------------------------------------
data2 = df[['b', 'c', 'd']] = 
                b          c          d
one    90.198909  41.946498  57.696927
two    92.361098  12.128027  58.962167
three  18.977019  92.999803  47.113144
four   99.227877   4.032991  27.748419
----------------------------------------------------------------------------------------------------
data = df['a'] < 50 = 
 one       True
two       True
three    False
four     False
Name: a, dtype: bool
--------------------------------------------------
data3 = df[df['a'] < 50] = 
              a          b          c          d
one   9.835341  90.198909  41.946498  57.696927
two  42.118455  92.361098  12.128027  58.962167
--------------------------------------------------
data4 = df[df['a'] < 50].iloc[:2] = 
 a    42.118455
b    92.361098
c    12.128027
d    58.962167
Name: two, dtype: float64

Process finished with exit code 0

四、行切片&列切片:df.iloc[1:3, 2:6]

根据位置和名称信息混搭的取数:对于一个DaraFrame,如果我想提取c行及其之前所有的,同时属于前4列的数呢?

iloc[num_of_row_start : num_of_row_end, num_of_column_start : num_of_column_end]

import numpy as np
import pandas as pd

df = pd.DataFrame(np.nan,
                  index=list('abcde'),
                  columns=['x', 'y', 'z', 8, 9])
print("df = \n", df)

print("-" * 100)

df_select = df.iloc[:df.index.get_loc('c') + 1, :4]
print("df_select = \n", df_select)

打印结果:

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 = 
     x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

Process finished with exit code 0

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




参考资料:
Python笔记:df.loc[]和df.iloc[]的区别

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值