pandas是一个第三方数据分析库,其集成了大量的数据模型和分析工具,可以方便的处理和分析各类数据。其中主要对象类型有Series,DataFrame和Index。本文介绍DataFrame对象的基本创建方法。
关于DataFrame的基础用法,可以查看下面的文章:
Python 利用pandas处理CSV文件(DataFrame的基础用法)
文章目录
- 一、DataFrame的创建方法
-
- [1.1 通过Python序列对象创建](#1.1 通过Python序列对象创建)
- [1.2 通过Python字典对象创建](#1.2 通过Python字典对象创建)
- [1.3 空值导致的类型转换](#1.3 空值导致的类型转换)
- [1.4 通过其他函数创建](#1.4 通过其他函数创建)
一、DataFrame的创建方法
DataFrame是包含索引的二维数据结构,数据结构和Excel或关系型数据库的表非常类似。重点是其在行、列上都是有标签的,其中纵向的标签叫做索引标签(定位每一行),横向的标签叫做列标签(定位每一列),标签也是Pandas中一种对象类型(Index对象)。
1.1 通过Python序列对象创建
Pandas中的的DataFrame函数可以将其他对象转换为DataFrame对象,传入列表或元组即可得到一个DataFrame对象(首次使用需要导入pandas):
python
import pandas as pd
df = pd.DataFrame([1,2,'a'])

这里看起来和Series很像,但注意DataFrame是包含列标签的,对比Series看一下区别:
python
s = pd.Series([1,2,'a'])

创建一个二维DataFrame,默认索引标签和列标签都是从0开始方差为1的等差数列(0,1,2,3...):
python
df = pd.DataFrame([[1,2,3], [4,5,6]])

通过传入index和columns参数可以显式指定索引标签和列标签(为行和列命名,方便引用):
python
df = pd.DataFrame([[1,2,3], [4,5]], index=['a','b'], columns=['x','y','z'])

1.2 通过Python字典对象创建
通过Python字典创建DataFrame时,字典的键默认会变为列标签,索引标签为数字:
python
d = {'x':[1,2,3], 'y':[4,5,6]}
df = pd.DataFrame(d)

如果字典的值是Series,那么Series的标签会成为DataFrame的索引标签:
python
s1 = pd.Series([1,2,3], index=['a','b','c'])
s2 = pd.Series([4,5,6], index=['b','c','d'])
d = {'x':s1, 'y':s2}
df = pd.DataFrame(d)

可以看到DataFrame会包含s1和s2的所有标签,另一个Series中不存在的标签会使用NaN(Not a Number)填充。
我们可以把DataFrame看作由Series组成的字典,每一列都是一个Series,用字典的方式引用列标签就可以得到Series:
python
df['x']

1.3 空值导致的类型转换
这里有个小问题,我们创建的时候传入数字都是整型,为什么最终的DataFrame中变成了浮点型(float64)?答案是这里填入了NaN(即np.nan),这是NumPy中一个特殊的浮点类型,代表数字类型的空值,而Series是同构的,因此为了兼容NaN,需要将数据类型向高级的转换,所以整列的类型都变成了浮点型。
如果s1包含'd'索引,就不会出现这种转换,和上面的例子对比一下区别:
python
s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
s2 = pd.Series([4,5,6], index=['b','c','d'])
d = {'x':s1, 'y':s2}
df = pd.DataFrame(d)
df['x'].dypte
df['y'].dypte

x列由于不需要填充NaN,保留了整型(int64),而y列需要填入NaN,整列都被转换为浮点型(float64)。
1.4 通过其他函数创建
上面都是通过手搓的方式创建DataFrame,实际数据分析中我们较少使用这种方式,更常见的方式是从文件中读取数据转换为DataFrame对象。Pandas的read_csv, read_execl等函数可以从对应的文件格式中读取数据并返回DataFrame对象,在数据分析中更加常用,具体操作方法可以参考文首的链接。