约定第一行代码

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

DataFrame

DataFrame 是 Python 中 Pandas 库中的一种数据结构,是一种二维表。它类似 excel,或许说它可能有点像 matlab 的矩阵,但是 matlab 的矩阵只能放数值型值(当然 matlab 也可以用 cell 存放多类型数据),DataFrame 的单元格可以存放数值、字符串等,这就和 excel 表很像。

一、DataFrame对象常用属性

  • 创建DateFrame方法有很多(后面再介绍),最常用的是直接传入一个由等长列表或Numpy组成的字典:
dict1={"Province":["Guangdong","Beijing","Qinghai","Fujiang"],
      "year":[2018]*4,
      "pop":[1.3,2.5,1.1,0.7]}
df1=DataFrame(dict1)
df1

代码结果:

Provinceyearpop
0Guangdong20181.3
1Beijing20182.5
2Qinghai20181.1
3Fujiang20180.7
  • 同Series一样,也可在创建时指定序列(对于字典中缺失的用NaN):
df2=DataFrame(dict1,
              columns=['year','Province','pop','debt'],
              index=['one','two','three','four'])
df2

代码结果:

Provinceyearpopdebt
oneGuangdong20181.3NaN
twoBeijing20182.5NaN
threeQinghai20181.1NaN
fourFujiang20180.7NaN
  • 同Series一样,DataFrame的index和columns有name属性:
df2.index.name='English'
df2.columns.name='Province'
df2
ProvinceProvinceyearpopdebt
English
oneGuangdong20181.3NaN
twoBeijing20182.5NaN
threeQinghai20181.1NaN
fourFujiang20180.7NaN
  • 通过shape属性获取DataFrame的行数和列数:

df2.shape

代码结果:

(4, 4)

  • values属性也会以二维ndarray的形式返回DataFrame的数据:

df2.values

代码结果:

array([['Guangdong', 2018 , 1.3, nan],
       ['Beijing', 2018 , 2.5, nan],
       ['Qinghai', 2018 , 1.1, nan],
       ['Fujiang', 2018 , 0.7, nan]], dtype=object)

二、DataFrame对象常见存取、赋值和删除方式

  • DataFrame_object[ ] 能通过列索引来存取,当只有一个标签则返回Series,多于一个则返回DataFrame:

df2['Province']

代码结果:

English
one      Guangdong
two        Beijing
three      Qinghai
four       Fujiang
Name: Province, dtype: object

df2[['Province','pop']]

代码结果:

ProvinceProvincepop
English
oneGuangdong1.3
twoBeijing2.5
threeQinghai1.1
fourFujiang0.7
  • DataFrame_object.loc[ ] 能通过行索引来获取指定行:

df2.loc['one']

year             2018
Province    Guangdong
pop               1.3
debt              NaN
Name: one, dtype: object

df2.loc['one':'three']

代码结果:

ProvinceProvinceyearpopdebt
English
oneGuangdong20181.3NaN
twoBeijing20182.5NaN
threeQinghai20181.1NaN
  • 当然也可以取单值

df2.loc['one','Province']

代码结果:

'Guangdong'

  • DataFrame的列可以通过赋值(一个值或一组值)来修改:
df2["debt"]=np.arange(2,3,0.25)
df2

代码结果:

ProvinceProvinceyearpopdebt
English
oneGuangdong20181.32.00
twoBeijing20182.52.25
threeQinghai20181.12.50
fourFujiang20180.72.75
  • 为不存在的列赋值会创建一个新的列,可通过del来删除:
df2['eastern']=None
df2

代码结果:

ProvinceProvinceyearpopdebteastern
English
oneGuangdong20181.32.00NaN
twoBeijing20182.52.25NaN
threeQinghai20181.12.50NaN
fourFujiang20180.72.75NaN
  • 删除某列
del df2['eastern']
df2.columns

代码结果:

Index(['year', 'Province', 'pop', 'debt'], dtype='object', name='Province')

三、多种创建DataFrame方式

  • 调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引.data可以是:二维数组字典结构数组.

二维数组

df3=pd.DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=['A','B','C','D'])
df3

代码结果:

ABCD
16768
22845
31454
44290

字典

值得注意的是行索引由index决定,列索引由字典的键决定

dict1 = {'Province': ['Guangdong', 'Beijing', 'Qinghai', 'Fujiang'],
         'year': [2018, 2018, 2018, 2018]},
         'pop': [1.3, 2.5, 1.1, 0.7]
         
df4=pd.DataFrame(dict1,index=[1,2,3,4])
df4

代码结果:

Provinceyearpop
0Guangdong20181.3
1Beijing20182.5
2Qinghai20181.1
3Fujiang20180.7

结构数组

其中列索引由结构数组的字段名决定

arr=np.array([('item1',10),('item2',20),('item3',30),('item4',40)],dtype=[("name","10S"),("count",int)])
df5=pd.DataFrame(arr)
df5

dtype里面的"10S"表示array里面元素里面的第一个值字符串长度不能超过10,否则不能正常显示

代码结果:

namecount
0b'item1'10
1b'item2'20
2b'item3'30
3b'item4'40

四、将DataFrame对象转换为其他格式的数据

  • to_dict()方法将DataFrame对象转换为字典,参数orient决定字典元素的类型:
df3.to_dict()
#代码结果:
{'A': {1: 6, 2: 2, 3: 1, 4: 4},
 'B': {1: 7, 2: 8, 3: 4, 4: 2},
 'C': {1: 6, 2: 4, 3: 5, 4: 9},
 'D': {1: 8, 2: 5, 3: 4, 4: 0}}
df3.to_dict(orient="records")
#代码结果:
[{'A': 6, 'B': 7, 'C': 6, 'D': 8},
 {'A': 2, 'B': 8, 'C': 4, 'D': 5},
 {'A': 1, 'B': 4, 'C': 5, 'D': 4},
 {'A': 4, 'B': 2, 'C': 9, 'D': 0}]
df3.to_dict(orient="list")
#代码结果:
{'A': [6, 2, 1, 4], 'B': [7, 8, 4, 2], 'C': [6, 4, 5, 9], 'D': [8, 5, 4, 0]}
  • 类似的还有to_records()、to_csv()等
世界因代码而改变 Peace Out
世界因代码而改变 Peace Out
最后修改:2020 年 10 月 07 日 03 : 22 PM
如果觉得我的文章对你有用,请随意赞赏