9.2.DataFra
from toolkit import H
from pandas import DataFrame
from pandas import Series
import numpy as np
Windows 10
Python 3.8.8 @ MSC v.1928 64 bit (AMD64)
Latest build date 2021.02.27
pandas version: 1.2.2
numpy version: 1.20.1
DataFrame类
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型1(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做是Series的容器。
pandas中的DataFrame
可以使用以下构造函数创建:
DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
data
:数据可以是各种形式,如:ndarray
,series
,map
,lists
,dict
,constant
和另一个DataFrame
。index
:行标签。默认为np.arrange(n)
。columns
:列标签。默认为np.arrange(n)
。dtype
:数据类型。copy
:是否复制数据。
可以输入给DataFrame构造器的数据:
类型 | 说明 |
---|---|
二维ndarray | |
由list或tuple组成的list | 类似于“二维ndarray” |
由数组、列表或元组组成的字典 | 每个序列作为DataFrame的一列。所有序列的长度必须相同。 |
由Series组成的字典 | 每个Series会成为一列。如果没有显式指定index,则 各Series的index会被合并成结果的行索引。每个Series的长度不要求必须相同,DataFrame会以NaN填充。 |
NumPy的结构化/记录数组 | 类似于“由数组组成的字典” |
由字典组成的字典 | 各内层字典会成为一列。键会被合并成结果的行索引,跟由“Series组成的字典”的情况一样 |
字典或Series的列表 | 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标 |
另—个DataFrame | 该DataFrame的索引将会被沿用,除非显式指定了其他索引 |
NumPy 的 Masked Array | 类似于“二维ndarray”的情况,只是掩码值在结果 DataFrame会变成NA/缺失值 |
总的来说,支持输入的数据类型是:dict
、list
、ndarray
、DataFrame
。
从列表创建
可以使用单个列表或列表内嵌列表来创建DataFrame。
单个列表的例子:
data = [1, 2, 3, 4, 5]
DataFrame(data)
0
0 1
1 2
2 3
3 4
4 5
列表内嵌列表的例子:
data = [['Alex', 10], ['Bob', 12], ['Clarke', 13]]
DataFrame(data, columns=['Name', 'Age'])
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
从包含array/List/Series的字典创建
传入一个由等长list、ndarray组成的字典:
结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列。
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
DataFrame(data)
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列:
DataFrame(data, columns=['year', 'state', 'pop'])
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
传入一个由等长Series或不等长Series组成的字典:
data = {'state': Series(['Ohio', 'Ohio', 'Nevada'], index=['a', 'b', 'c']),
'year': Series([2000, 2002, 2001, 2002], index=['a', 'b', 'c', 'd']),
'pop': Series([1.7, 3.6, 2.4], index=['b', 'c', 'd'])}
DataFrame(data)
state year pop
a Ohio 2000 NaN
b Ohio 2002 1.7
c Nevada 2001 3.6
d NaN 2002 2.4
从字典列表创建
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
DataFrame(data, index=['first', 'second'])
a b c
first 1 2 NaN
second 5 10 20.0
替代构造函数
DataFrame.from_dict
DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)
DataFrame.from_dict
接受dict或类似数组的序列的dict并返回DataFrame。
DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))
DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]),
orient='index', columns=['one', 'two', 'three'])
one two three
A 1 2 3
B 4 5 6
DataFrame.from_records
DataFrame.from_records(data, index=None, exclude=None, columns=None,
coerce_float=False, nrows=None)
DataFrame.from_records
接受具有结构化dtype的元组或ndarray的列表。它与普通的DataFrame
构造函数相似,除了所得的DataFrame索引可能是结构化dtype的特定字段。例如:
data = np.array([(1, 2., b'Hello'), (2, 3., b'World')],
dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])
DataFrame.from_records(data, index='C')
A B
C
b'Hello' 1 2.0
b'World' 2 3.0
DataFrame.from_items
从元组序列中创建DataFrame
。
DataFrame.from_items(items, columns=None, orient='columns')
items
: 为元组序列,元组格式为:(key, value)
。columns
:列标签。当orient='index'
时必须传入columns
。当orient='columns'
时,key
就是列的label,此时columns
参数指定的列label必须等于某个key
,否则抛出异常。orient
:数据的方向,{'index', 'columns'}
。
DataFrame.from_items
类方法从pandas 0.23版本起不再推荐使用,在未来的版本中会被移除。
print("pandas version:", pd.__version__)
print("Has 'from_items' attr?", hasattr(DataFrame, "from_items"))
pandas version: 1.2.2
Has 'from_items' attr? False
-
实际上,DataFrame每一个值都可以是不同的数据类型。 ↩