pandas直接读取文件相当方便,但是刚接触时,DataFrame型的行列选择极易让人混乱,常与array型的选取混淆。总结一下两种结构不同的行列操作。
# 首先弄点数据
import numpy as np
import pandas as pd
a = np.random.randn(3,4)
a = pd.DataFrame(a)
a.columns=['A','B','简','书']
b = np.array(a)
a
Out:
A B 简 书
0 -0.111949 0.527505 2.368722 1.224539
1 0.682014 1.437826 0.004001 -0.330349
2 0.716501 -1.719973 0.718745 2.023330
b
Out:
array([[-0.11194892, 0.5275052 , 2.36872241, 1.22453866],
[ 0.68201417, 1.43782573, 0.00400142, -0.33034887],
[ 0.7165014 , -1.71997254, 0.71874518, 2.02332967]])
行选择
DataFrame
可以使用loc[],iloc[],ix[]来选择。
# 连续选择,注意括号里的包含关系
a.loc[1:3]
Out:
A B 简 书
1 0.682014 1.437826 0.004001 -0.330349
2 0.716501 -1.719973 0.718745 2.023330
# 选择单行
a.loc[[1,2]]
Out:
A B 简 书
1 0.682014 1.437826 0.004001 -0.330349
2 0.716501 -1.719973 0.718745 2.023330
# 选择某个数据
a.ix[[1],[1]]
Out:
B
1 1.437826
array
相比之下,矩阵的操作则要方便许多。
# 连续选择
b[1:3]
Out:
array([[ 0.68201417, 1.43782573, 0.00400142, -0.33034887],
[ 0.7165014 , -1.71997254, 0.71874518, 2.02332967]])
# 选择单行
b[[1,2]]
Out:
array([[ 0.68201417, 1.43782573, 0.00400142, -0.33034887],
[ 0.7165014 , -1.71997254, 0.71874518, 2.02332967]])
# 某个数据选择
b[1,1]
Out: 1.4378257322265775
列选择
DataFrame
较之行选择,DataFrame格式的列选择要简单些,中英文的column都可以直接通过列名选取。
# 通过列名
a.A
Out:
0 -0.111949
1 0.682014
2 0.716501
Name: A, dtype: float64
a[['B','书']]
Out:
B 书
0 0.527505 1.224539
1 1.437826 -0.330349
2 -1.719973 2.023330
有时候column的名称复杂,经常要切换输入法,很不方便,或者想选择很多列时,可以通过索引来进行选取。pandas这里有个小坑,连续列直接用a[1:3]会报错 =='
# 通过索引号,连续列选择
a[np.arange(1,3)]
Out:
B 简
0 0.527505 2.368722
1 1.437826 0.004001
2 -1.719973 0.718745
# 通过索引号,选择特定列
a[[1,3]]
Out:
B 书
0 0.527505 1.224539
1 1.437826 -0.330349
2 -1.719973 2.023330
array
感受下数值处理时矩阵的简捷直观。
b[:,[1,3]]
Out:
array([[ 0.5275052 , 1.22453866],
[ 1.43782573, -0.33034887],
[-1.71997254, 2.02332967]])
b[[1,2],[1,2]]
Out: array([ 1.43782573, 0.71874518])
补充下openpyxl打开xlsx文件下数据的选取。
import openpyxl
wb = openpyxl.load_workbook('file path')
sheets = wb.get_sheet_names()
sheet1 = wb.get_sheet_by_name(sheets[0])
sheet1['B1'].value # 通过单元格索引打开
sheet1.cell(row=1, column=1).value # 通过行列号
两种结构可以方便的相互转换,pd.DataFrame(),np.array()【或者np.asarray(),两者有略微的差别】。挑一种顺手的套路吧!
TBC