python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引相关的知识,希望对你有一定的参考价值。

参考技术A 1、pandas排序,并取前N列数据

2、取行、取列DataFrame.loc,DataFrame.iloc
- 取行DataFrame.loc,DataFrame.iloc

学习 Python 之 Pandas库

学习 Python 之 Pandas库

Pandas库

什么是Pandas库?

Pandas是基于Numpy的专业数据分析工具, 可以灵活高效的处理各种数据集

它提供了的数据结构有DataFrame和Series等

我们可以简单粗的把DataFrame理解为Excel里面的一张表,而Series就是表中的某一列

DataFrame 创建和存储

函数

函数作用
DataFrame(data = 数据, index = 行标题, columns = 列标题, dtype = 类型, copy = 是否深拷贝)创建DataFrame对象
read_csv(filepath_or_buffer = 文件路径, delimiter = 分隔符, header = 是否第一行为列标题, engine = 引擎, encoding = 编码)读取.csv文件创建DataFrame对象
read_excel(路径, header = 指定哪一行为标题, names = 指定列标题)读取.xlsx文件创建DataFrame对象
.to_csv(路径)保存为.csv文件
.to_excel(路径)保存为.xlsx文件

1. 使用DataFrame构造函数

函数作用
DataFrame(data = 数据, index = 行标题, columns = 列标题, dtype = 类型, copy = 是否深拷贝)创建DataFrame对象

创建时不指定index,系统会自动生成从0开始的索引, 即行标题从0开始

(1). 使用列表创建

import pandas

dataFrame = pandas.DataFrame(
    data = [
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index = ['小明', '小红', '小强',],
    columns=['语文', '数学', '英语', '化学'],
    dtype = float,
    copy = True
)
print(dataFrame)

结果:

      语文    数学    英语    化学
小明  60.0  78.0  92.0  85.0
小红  70.0  68.0  95.0  76.0
小强  88.0  98.0  83.0  87.0

使用列表创建

一个列表表示一条记录

index是每一条记录的名称

columns是每一列的名字

(2). 使用字典创建

import pandas

dataFrame = pandas.DataFrame(
    data = 
        '语文': [60, 78, 92, 85],
        '数学': [70, 68, 95, 76],
        '英语': [88, 98, 83, 87],
    ,
    index = ['小明', '小红', '小强', '小美'],
    dtype = float,
    copy = True
)
print(dataFrame)

结果:

      语文    数学    英语
小明  60.0  70.0  88.0
小红  78.0  68.0  98.0
小强  92.0  95.0  83.0
小美  85.0  76.0  87.0

使用字典创建

列名称是字典中键的名称, 字典中的元素是该列的值

index是每一条记录的名称, index的长度与字典中某一个键值对的值的长度一样

(3). 从另一个DataFrame对象创建

import pandas

dataFrame = pandas.DataFrame(
    data = [
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index = ['小明', '小红', '小强', ],
    columns = ['语文', '数学', '英语', '化学'],
    dtype = float,
    copy = False
)
dataFrame2 = pandas.DataFrame(dataFrame, copy = False)
print(dataFrame2)
dataFrame2['语文'] = [0, 0, 0]
print(dataFrame)

结果:

      语文    数学    英语    化学
小明  60.0  78.0  92.0  85.0
小红  70.0  68.0  95.0  76.0
小强  88.0  98.0  83.0  87.0
    语文    数学    英语    化学
小明   0  78.0  92.0  85.0
小红   0  68.0  95.0  76.0
小强   0  98.0  83.0  87.0

从已有的DataFrame创建, copy参数可以指定深拷贝还是浅拷贝

当copy = False是浅拷贝, 上面的这个例子就证明了

2. 从文件读取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMk2NWK0-1653756723926)(Pandas图片/img_1.png)]

函数作用
read_csv(filepath_or_buffer = 文件路径, delimiter = 分隔符, header = 是否第一行为列标题, engine = 引擎, encoding = 编码)读取.csv文件创建DataFrame对象
read_excel(路径, header = 指定哪一行为标题, names = 指定列标题)读取.xlsx文件创建DataFrame对象

(1). 从.csv文件读取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mgUNQi5s-1653756723932)(Pandas图片/img_2.png)]

import pandas

dataFrame = pandas.read_csv('../数据/test.csv')
print(dataFrame)

结果:

   姓名    语文    数学     英语
0  小明  62.0  66.0   86.0
1  小红  86.0  97.5  100.0

默认分隔符以","逗号分割, 可以指定分割类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7ZJOOY8-1653756723933)(Pandas图片/img_3.png)]

import pandas

dataFrame = pandas.read_csv(
    '../数据/test.csv',
    delimiter = '|'
)
print(dataFrame)

结果:

   姓名    语文    数学     英语
0  小明  62.0  66.0   86.0
1  小红  86.0  97.5  100.0

默认以第一行作为列标题, 可以不知道列标题, 这样第一行也变成了数据

import pandas

dataFrame = pandas.read_csv(
    filepath_or_buffer = '../数据/test.csv',
    delimiter = '|',
    header = None,
    engine = 'python',
    encoding = 'utf-8'
)
print(dataFrame)

结果:

    0    1     2     3
0  姓名   语文    数学    英语
1  小明  62.   66.   86.
2  小红  86.  97.5  100.

engine是使用的分析引擎,读取csv文件一般指定python避免中文和编码造成的报错

encoding是编码格式

(2). 从excel文件读取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgUJE8ej-1653756723934)(Pandas图片/img.png)]

import pandas

dataFrame = pandas.read_excel(
    '../数据/test.XLSX',
    header = None
)
print(dataFrame)
    0     1     2
0  姓名    语文    数学
1  小明  66.5    86
2  小红    89  99.5

3. 存储

函数作用
.to_csv(路径)保存为.csv文件
.to_excel(路径)保存为.xlsx文件

DataFrame 查看数据

函数

函数作用
.head(n = 5)查看数据前n行
.tail(n = 5)查看数据后n行
.info()查看数据信息
.describe()查看数据统计信息

1. 查看前几行

import pandas
from sklearn import datasets

iris = datasets.load_iris()
dataFrame = pandas.DataFrame(iris.data)
print(dataFrame.head(10))

结果:

     0    1    2    3
0  5.1  3.5  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  1.3  0.2
3  4.6  3.1  1.5  0.2
4  5.0  3.6  1.4  0.2
5  5.4  3.9  1.7  0.4
6  4.6  3.4  1.4  0.3
7  5.0  3.4  1.5  0.2
8  4.4  2.9  1.4  0.2
9  4.9  3.1  1.5  0.1

2. 查看后几行

import pandas
from sklearn import datasets

iris = datasets.load_iris()
dataFrame = pandas.DataFrame(iris.data)
print(dataFrame.tail())

结果:

       0    1    2    3
145  6.7  3.0  5.2  2.3
146  6.3  2.5  5.0  1.9
147  6.5  3.0  5.2  2.0
148  6.2  3.4  5.4  2.3
149  5.9  3.0  5.1  1.8

3. 格式查看

import pandas
from sklearn import datasets

iris = datasets.load_iris()
dataFrame = pandas.DataFrame(iris.data)
print(dataFrame.info())

结果:

# 对象的类型
<class 'pandas.core.frame.DataFrame'>
# 数据范围, 一共150个, 从0 - 149
RangeIndex: 150 entries, 0 to 149
# 数据一共4列
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   0       150 non-null    float64
 1   1       150 non-null    float64
 2   2       150 non-null    float64
 3   3       150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB
None

4. 查看统计信息

import pandas
from sklearn import datasets

iris = datasets.load_iris()
dataFrame = pandas.DataFrame(iris.data)
print(dataFrame.describe())

结果:

                0           1           2           3
count  150.000000  150.000000  150.000000  150.000000
mean     5.843333    3.057333    3.758000    1.199333
std      0.828066    0.435866    1.765298    0.762238
min      4.300000    2.000000    1.000000    0.100000
25%      5.100000    2.800000    1.600000    0.300000
50%      5.800000    3.000000    4.350000    1.300000
75%      6.400000    3.300000    5.100000    1.800000
max      7.900000    4.400000    6.900000    2.500000

DataFrame 列操作

函数

函数作用
.drop(列名, axis = 1, inplace = True)查看数据前n行

1. 增加列

增加一列,用dataFrame[‘新列名’] = 新列值的形式, 在原数据基础上赋值即可

import pandas

dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index = ['小明', '小红', '小强', ],
    columns = ['语文', '数学', '英语', '化学'],
    dtype = float
)
print(dataFrame)
dataFrame['生物'] = [96, 86, 88]
print(dataFrame)

结果:

      语文    数学    英语    化学
小明  60.0  78.0  92.0  85.0
小红  70.0  68.0  95.0  76.0
小强  88.0  98.0  83.0  87.0
      语文    数学    英语    化学  生物
小明  60.0  78.0  92.0  85.0  96
小红  70.0  68.0  95.0  76.0  86
小强  88.0  98.0  83.0  87.0  88

将其他的数据列增加过来, 即横向合并

import pandas

dataFrame1 = pandas.DataFrame(
    data=[
        ['一级', '读书', 21, 176],
        ['二级', '游泳', 22, 178],
        ['三级', '游泳', 21, 185],
        ['二级', '游泳', 19, 182],
    ],
    columns=['等级', '爱好', '年龄', '身高'],
    index = ['小明', '小红', '小强', '小于']
)
print(dataFrame1)
dataFrame2 = pandas.DataFrame(
    data=[
        ['学士', 'O'],
        ['学士', 'A'],
        ['博士', 'A'],
        ['院士', 'B'],
    ],
    columns=['学位', '血型'],
    index = ['小明', '小红', '小强', '小于']
)
print(dataFrame2)
r = pandas.merge(
    left = dataFrame1,
    right = dataFrame2,
    left_index = True,
    right_index = True,
    how = 'inner'
)
print(r)

结果:

    等级  爱好  年龄   身高
小明  一级  读书  21  176
小红  二级  游泳  22  178
小强  三级  游泳  21  185
小于  二级  游泳  19  182
    学位 血型
小明  学士  O
小红  学士  A
小强  博士  A
小于  院士  B

2. 删除列

使用, axis = 0表示对行操作, axis = 1表示针对列的操作, inplace为True, 则直接在源数据上进行修改, 否则源数据会保持原样

import pandas

dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index = ['小明', '小红', '小强', ],
    columns = ['语文', '数学', '英语', '化学'],
    dtype = float
)
dataFrame['生物'] = [96, 86, 88]
print(dataFrame)
dataFrame.drop('化学', axis = 1, inplace = True)
print(dataFrame)

结果:

      语文    数学    英语    化学  生物
小明  60.0  78.0  92.0  85.0  96
小红  70.0  68.0  95.0  76.0  86
小强  88.0  98.0  83.0  87.0  88
      语文    数学    英语  生物
小明  60.0  78.0  92.0  96
小红  70.0  68.0  95.0  86
小强  88.0  98.0  83.0  88

3. 选择列

import pandas
dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index=['小明', '小红', '小强', ],
    columns=['语文', '数学', '英语', '化学'],
    dtype=float
)
print(dataFrame['语文'])
print(dataFrame[['语文', '化学']])

结果:

小明    60.0
小红    70.0
小强    88.0
Name: 语文, dtype: float64
      语文    化学
小明  60.0  85.0
小红  70.0  76.0
小强  88.0  87.0

4. 修改列

全部修改为同一个值

指定修改的列的内容

import pandas
dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    index=['小明', '小红', '小强', ],
    columns=['语文', '数学', '英语', '化学'],
    dtype=float
)
dataFrame['语文'] = 1
dataFrame['化学'] = [100, 100, 100.0]
print(dataFrame)

结果:

    语文    数学    英语     化学
小明   1  78.0  92.0  100.0
小红   1  68.0  95.0  100.0
小强   1  98.0  83.0  100.0

DataFrame 索引

属性作用
iloc[ , ]对数据操作, 允许整数, 整数的列表, 切片, 布尔数组
loc[ , ]对数据操作, 允许标签和布尔
isin(数据列表)处于数据列表

1. 数字索引

dataFrame[行索引, 列索引]

取出数据中 3×3的零

import pandas

dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87],
        [60, 78, 92, 85],
        [70, 0, 0, 0],
        [88, 0, 0, 0],
        [60, 0, 0, 0],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    dtype = float,
    columns = ['语文', '数学', '英语', '化学']
)
a = dataFrame.iloc[4:7, 1:]
print(a)

结果:

    数学   英语   化学
4  0.0  0.0  0.0
5  0.0  0.0  0.0
6  0.0  0.0  0.0

取出数据中 2×2的零

import pandas

dataFrame = pandas.DataFrame(
    data=[
        [60, 78, 92, 85],
        [70, 68, 95, 76],
        [88, 98, 83, 87],
        [60, 78, 92, 85],
        [70, 0, 92, 0],
        [60, 78, 92, 85],
        [60, 0, 92, 0],
        [70, 68, 95, 76],
        [88, 98, 83, 87]
    ],
    dtype = float,
    columns = ['语文', '数学', '英语', '化学']
)
a = dataFrame.iloc[4:7:2, 1:4:2]
print(a)

结果:

    数学   化学
4  0.0  0.0
6  0.0  0.0

2. 布尔索引

dataFrame[行索引, 列索引]

行索引和列索引可以是布尔数组

import pandas

dataFrame = pandas.DataFrame(
    data=[
        ['一级', '读书', 21, 176],
        ['二级', '游泳', 22, 178],
        ['三级', '游泳', 21, 185],
        ['二级', '游泳', 19, 182],
    ],
    columns = ['等级', '爱好', '年龄', '身高']
)
b = [True, False, False, True]
a = dataFrame.iloc[b, :]
print(a)

结果:

   等级  爱好  年龄   身高
0  一级  读书  21  176
3  二级  游泳  19  182

iloc()函数参数允许:

  1. 整数
  2. 整数的列表
  3. 切片
  4. 布尔数组

3. 标签索引

import pandas

dataFrame = pandas.DataFrame(
    data=[
        ['一级', '读书', 21, 176],
        ['二级', '游泳', 22, 178],
        ['三级', '游泳', 21, 185<

以上是关于python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引的主要内容,如果未能解决你的问题,请参考以下文章

010 pandas的DataFrame

Python数据分析pandas之dataframe初识

学习 Python 之 Pandas库

学习 Python 之 Pandas库

学习 Python 之 Pandas库

利用python数据分析panda学习笔记之DataFrame