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')

Series对象有哪些特点 多个series对象可以构成dataframe_文件创建


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)

Series对象有哪些特点 多个series对象可以构成dataframe_pandas_02


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)

Series对象有哪些特点 多个series对象可以构成dataframe_文件创建_03


如上,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)

Series对象有哪些特点 多个series对象可以构成dataframe_pandas_04


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,查看每列元素类型

Series对象有哪些特点 多个series对象可以构成dataframe_pandas_05

创建

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)

Series对象有哪些特点 多个series对象可以构成dataframe_文件创建_06


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

Series对象有哪些特点 多个series对象可以构成dataframe_文件创建_07


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)

Series对象有哪些特点 多个series对象可以构成dataframe_文件创建_08

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()

Series对象有哪些特点 多个series对象可以构成dataframe_Series对象有哪些特点_09


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型,选取这一列作为索引。