zl程序教程

您现在的位置是:首页 >  Python

当前栏目

(六)Python:Pandas中的DataFrame

2023-02-18 15:50:07 时间

目录

基本特征

创建

自动生成行索引

自定义生成行索引

使用

索引与值

基本操作

统计功能 


基本特征

  • 一个表格型的数据结构
  • 含有一组有序的列(类似于index)
  • 大致可看成共享同一个index的Series集合

创建

        DataFrame与Series相比,除了可以每一个键对应许多值之外,还增加了列索引(columns)这一内容,具体内容如下所示:

自动生成行索引

        DataFrame也能自动生成行索引,索引从0开始,代码如下所示:

import pandas as pd

data = {'name': ['aaaaaa', 'bbbbbb', 'cccccc'], 'pay': [4000, 5000, 6000]}  # 以name和pay为列索引,创建DataFrame
frame = pd.DataFrame(data)  #自定义行索引
print(frame)

运行结果如下所示:

    name      pay 0  aaaaaa  4000 1  bbbbbb  5000 2  cccccc   6000

自定义生成行索引

       DataFrame除了能创建自动生成行索引外,还能自定义生成行索引,代码如下所示: 

import pandas as pd
import numpy as np

data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])  # 自定义列索引
print(frame)

运行结果如下所示:

 name   pay 1  aaaa  4000 2  bbbb  5000 3  cccc  6000

使用

索引与值

                我们可以通过一些基本方法来查看DataFrame的行索引、列索引和值,代码如下所示:

import pandas as pd
import numpy as np

data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])

print(frame.columns)    # 输出列索引
print(frame.index)      # 输出行索引
print(frame.values)     # 输出值

运行结果如下所示:

行索引 Index(['name', 'pay'], dtype='object') 列索引 RangeIndex(start=1, stop=4, step=1) 值 [['aaaa' '4000']  ['bbbb' '5000']  ['cccc' '6000']]

        除了进行查看,我们还能简单的对行索引和列索引进行修改,具体代码如下所示:

import pandas as pd
import numpy as np

data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(frame)

frame.columns = ['newname', 'newpay']
frame.index = range(2, 5)
print("---------------")
print(frame)
print("---------------")
print(frame.columns)    # 修改后的列索引
print(frame.index)      # 修改后的行索引

运行结果如下所示:

   name   pay 1  aaaa  4000 2  bbbb  5000 3  cccc  6000 ---------------   newname newpay 2    aaaa   4000 3    bbbb   5000 4    cccc   6000 --------------- Index(['newname', 'newpay'], dtype='object') RangeIndex(start=2, stop=5, step=1)

基本操作

  • 取DataFrame对象的列和行可获得Series

         具体实现如下代码所示:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
print(frame['name'])        # 取得某列
print(frame.pay)            # 取得某列
print(frame.iloc[1:3, 1])   # 第一行和第二行的第一列
print(frame.iloc[0:2, 0])   # 第零行和第一行的第零列(第一个0可省略)
print(frame.iloc[0:2])      # 少了第二个参数,就会输出所有列
print(frame.iloc[0:2, 1:3]) # 逗号左边操控行,右边操控列

运行结果如下所示:

取得name列 1    xiaoming 2    xiaohong 3     xiaolan Name: name, dtype: object 取得pay列 1    4000 2    5000 3    6000 Name: pay, dtype: object 取得第一行和第二行的第一列 2    5000 3    6000 Name: pay, dtype: object 取得第零行和第一行的第零列 1    xiaoming 2    xiaohong Name: name, dtype: object 少了第二个参数,就会输出所有列        name   pay  a 1  xiaoming  4000  1 2  xiaohong  5000  2 逗号左边操控行,右边操控列     pay  a 1  4000  1 2  5000  2

  •  DataFrame对象的修改和删除 

         具体代码如下所示:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
frame['name'] = 'admin'     # 将name一列全部换成admin
print(frame)
del frame['pay']            # 将pay一列全部删除
print(frame)
print(frame.drop(1, axis=0))    # 删除第一行
print(frame.drop(index=2))      # 另一种删除方法

运行结果如下所示:

将name一列全部换成admin name   pay  a 1  admin  4000  1 2  admin  5000  2 3  admin  6000  3 将pay一列全部删除     name  a 1  admin  1 2  admin  2 3  admin  3 删除第一行     name  a 2  admin  2 3  admin  3 另一种删除方法     name  a 1  admin  1 3  admin  3

(1)添加列

        添加列可直接赋值,例如给 aDF 中添加 tax 列的方法如下:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(aDF)
print("===============================")
aDF['tax'] = [0.05, 0.05, 0.1]        # 添加列
print(aDF)

运行结果如下所示:

      name   pay 1  xiaoming  4000 2  xiaohong  5000 3   xiaolan  6000 ===============================        name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10

(2)添加行

        添加行可用对象的标签(loc)和位置(iloc)索引,也可通过 append()方法或 concat()函数等进行处理,以 loc 为例,例如要给 aDF 添加一个新行,可用如下方法:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(aDF)
print("===============================")
aDF['tax'] = [0.05, 0.05, 0.1]        # 添加列
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}    # 添加行
print(aDF)

运行结果如下所示:

       name   pay 1  xiaoming  4000 2  xiaohong  5000 3   xiaolan  6000 ===============================        name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05

(3)删除行

        删除数据可直接用“del 数据”的方式进行,但这种方式是直接对原始数据操作,不是很安全,pandas 中可利用 drop()方法删除指定轴上的数据,drop()方法返回一个新的对象,不会直接修改原始数据。

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
print(aDF.drop(5))  # 返回删除第5行的数据,但本身未改变
print("===============================")
print(aDF)          # 自身未改变

运行结果如下所示:

       name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05 ===============================        name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 ===============================        name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05

(3)删除列

代码如下:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
print(aDF.drop('tax', axis=1))
print("===============================")
print(aDF)      # 自身未改变

运行结果如下所示:

      name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05 ===============================        name   pay 1  xiaoming  4000 2  xiaohong  5000 3   xiaolan  6000 5     Liuxi  5000 ===============================        name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05

通过修改参数的值,可以改变原来的数据,代码如下:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
aDF.drop('tax', axis=1, inplace=True)
print(aDF)      # 自身改变

运行结果如下所示:

       name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05 ===============================        name   pay 1  xiaoming  4000 2  xiaohong  5000 3   xiaolan  6000 5     Liuxi  5000

(4)修改

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
aDF['tax'] = 0.03  # 将一列修改为相同的值
print(aDF)
print("===============================")
aDF.loc[5] = ['Liuxi', 9800, 0.05]  # 修改某一行
print(aDF)
print("===============================")
print(aDF.loc[:, ['name', 'tax', 'pay']])  # 交换列
print("===============================")
print(aDF.iloc[:, [0, 2, 1]])   # 交换列

运行结果如下所示:

       name   pay   tax 1  xiaoming  4000  0.05 2  xiaohong  5000  0.05 3   xiaolan  6000  0.10 5     Liuxi  5000  0.05 =============================== 将一列修改为相同的值        name   pay   tax 1  xiaoming  4000  0.03 2  xiaohong  5000  0.03 3   xiaolan  6000  0.03 5     Liuxi  5000  0.03 =============================== 修改某一行        name   pay   tax 1  xiaoming  4000  0.03 2  xiaohong  5000  0.03 3   xiaolan  6000  0.03 5     Liuxi  9800  0.05 =============================== 交换列        name   tax   pay 1  xiaoming  0.03  4000 2  xiaohong  0.03  5000 3   xiaolan  0.03  6000 5     Liuxi  0.05  9800 =============================== 交换列        name   tax   pay 1  xiaoming  0.03  4000 2  xiaohong  0.03  5000 3   xiaolan  0.03  6000 5     Liuxi  0.05  9800

注: DataFrame对象的修改和删除还有很多方法,在此不一一列举,有兴趣的同学可以自己去找一下

统计功能 

  • DataFrame对象成员找最低工资和高工资人群信息

         DataFrame有非常强大的统计功能,它有大量的函数可以使用,具体代码如下所示:

import pandas as pd
import numpy as np

data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
print(frame.pay.min())      # 取得最小值
print(frame[frame.pay >='5000'])    # 找出工资>=5000人员的信息

运行结果如下所示:

工资最低值 4000 工资>=5000人员的信息        name   pay  a 2  xiaohong  5000  2 3   xiaolan  6000  3

未完待续