原文:https://github.com/hangsz/pandas-tutorial/blob/master/1. Series和DataFrame对象的创建.ipynb
pandas 中的核心对象是 Series 和 DataFrame,这一节主要介绍如何创建这两种对象。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
1.Series
Series 是 pandas 中暴露给我们使用的基本对象,它是由相同元素类型构成的一维数据结构,同时具有列表和字典的属性(字典的属性由索引赋予)。
- Series:有序,有索引
- list: 有序,无索引
- dict: 无序,有索引
预览:
data = [1,2,3]
index = ['a','b','c']
s = pd.Series(data=data, index=index, name = 'sss')
s.index # 四个属性之一:索引
Index(['a', 'b', 'c'], dtype='object')
s.name # 四个属性之二:名字
'sss'
s.values # 四个属性之三:值
array([1, 2, 3], dtype=int64)
s.dtype # 四个属性之四:元素类型
dtype('int64')
创建
pd.Series(data=None, index=None, name = None)
- data:多种类型,见下面具体介绍
- index:索引
- name:对data的说明,用的不多,一般在和DataFrame、Index互相转换时才需要。
data无索引
如果 data 为 ndarray(1D) 或 list(1D),那么其缺少 Series 需要的索引信息;
如果提供 index,则必须和data长度相同;
如果不提供 index,那么其将生成默认数值索引 range(0, data.shape[0])。
# data = [1,2,3]
data1 = np.array([1,2,3])
index1 = ['a','b','c']
s = pd.Series(data = data1, index = index1)
data有索引
如果 data 为 Series 或 dict ,那么其已经提供了 Series 需要的索引信息,所以 index 项是不需要提供的;
如果额外提供了 index 项,那么其将对当前构建的Series进行 重索引(增删)(等同于reindex操作)。
# data = pd.Series([a,b,c], index = ['a','b','c'] )
data2 = { 'a':1, 'b':2,'c':3 }
index2 = ['a','b','d']
s = pd.Series(data = data2, index = index2)
如上,index 项用于从当前已有索引中匹配出相同的行,如果当前索引缺失给定的索引,则填充 NaN(NaN:not a number 为 pandas 缺失值标记)。
2.DataFrame
DataFrame 由具有共同索引的 Series 按列排列构成(2D),是使用最多的对象。
预览
data = [[1,2,3],
[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
df = pd.DataFrame(data=data, index = index, columns = columns)
df.index # 行索引
Index(['a', 'b'], dtype='object')
df.columns # 列索引,与Series的name一个意思
Index(['A', 'B', 'C'], dtype='object')
df.values # 值
array([[1, 2, 3],
[4, 5, 6]], dtype=int64)
df.dtypes # 这里的dtype带s,查看每列元素类型
创建
pd.DataFrame(data=None, index=None, columns=None)
函数由多个参数,对我们有用的主要是:data,index 和 columns 三项
data无 行索引,无 列索引
- 如果 data 为 ndarray(2D) or list(2D),那么其缺少 DataFrame 需要的行、列索引信息;
- 如果提供 index 或 columns 项,其必须和data的行 或 列长度相同;
- 如果不提供 index 或 columns 项,那么其将默认生成数值索引range(0, data.shape[0])) 或 range(0, data.shape[1])。
# data = [[1,2,3],
# [4,5,6]]
data1 = np.array([[1,2,3],
[4,5,6]] )
index1 = ['a','b']
columns1 = ['A','B','C']
df = pd.DataFrame(data=data1, index = index1, columns = columns1)
data无 行索引,有 列索引
- 如果data为 dict of ndarray(1D) or list(1D),所有ndarray或list的长度必须相同。且dict的key为DataFrame提供了需要的columns信息,缺失index;
- 如果提供 index 项,必须和list的长度相同;
- 如果不提供 index,那么其将默认生成数值索引range(0, data.shape[0]));
- 如果还额外提供了columns项,那么其将对当前构建的DataFrame进行 列重索引。
data2 = { 'A' : [1,4], 'B': [2,5], 'C':[3,6] }
index2 = ['a','b']
columns2 = ['A','B','D']
df = pd.DataFrame(data=data2, index = index2, columns = columns2)
df
data有 行索引,有 列索引
- 如果data为 dict of Series or dict,那么其已经提供了DataFrame需要的所有信息;
- 如果多个Series或dict间的索引不一致,那么取并操作(pandas不会试图丢掉信息),缺失的数据填充NaN;
- 如果提供了index项或columns项,那么其将对当前构建的DataFrame进行 重索引(reindex,pandas内部调用接口)。
# data3 = { 'A' : pd.Series([1,4] ,index = ['a','b']), 'B' : pd.Series([2,5] ,index = ['a','b']), 'C' : pd.Series([3,6] ,index = ['a','c']) }
data3 = { 'A' : { 'a':1, 'b':4}, 'B': {'a':2,'b':5}, 'C':{'a':3, 'c':6} }
df = pd.DataFrame(data=data3)
3.由文件创建
由.csv文件创建
pd.read_csv(filepath_or_buffer, sep=’,’, header=‘infer’, names=None,index_col=None, encoding=None )
read_csv的参数很多,但这几个参数就够我们使用了:
- filepath_or_buffer:路径和文件名不要带中文,带中文容易报错。
- sep: csv文件数据的分隔符,默认是’,’,根据实际情况修改;
- header:如果有列名,那么这一项不用改;
- names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引;
- index_col:int型,选取这一列作为索引。
- encoding:根据你的文档编码来确定,如果有中文读取报错,试试encoding = ‘gbk’。
tips.csv:https://github.com/hangsz/pandas-tutorial/blob/master/tips.csv
tips = pd.read_csv( 'tips.csv')
tips.head()
tips.index
RangeIndex(start=0, stop=244, step=1)
tips.columns
Index(['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size'], dtype='object')
tips.values
array([[16.99, 1.01, 'Female', ..., 'Sun', 'Dinner', 2],
[10.34, 1.66, 'Male', ..., 'Sun', 'Dinner', 3],
[21.01, 3.5, 'Male', ..., 'Sun', 'Dinner', 3],
...,
[22.67, 2.0, 'Male', ..., 'Sat', 'Dinner', 2],
[17.82, 1.75, 'Male', ..., 'Sat', 'Dinner', 2],
[18.78, 3.0, 'Female', ..., 'Thur', 'Dinner', 2]], dtype=object)
由.excel文件创建
pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None)
read_excel的参数很多,但这几个参数就够我们使用了:
- header:如果有列名,那么这一项不用改;
- names:如果没有列名,那么必须设置header = None, names为列名的列表,不设置默认生成数值索引;
- index_col:int型,选取这一列作为索引。