认识 Series 和 DataFrame
import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame
1
2
3
4
2
3
4
# Series
Series 是 pandas 中暴露给我们使用的基本对象,它是由相同元素类型构成的一维数据结构,同时具有列表和字典的特点
# 预览
data = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
s = Series(data, index=index)
s
1
2
3
4
2
3
4
a 1
b 2
c 3
d 4
e 5
dtype: int64
s.index
1
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
s.name
1
s.values
1
array([1, 2, 3, 4, 5])
s.dtype
1
dtype('int64')
s.shape
1
(5,)
# 创建
Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
# 无索引创建
- 如果 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)
s
1
2
3
4
5
2
3
4
5
a 1
b 2
c 3
dtype: int64
# 有索引创建
- 如果 data 为 Series 或 dict ,那么其已经提供了 Series 需要的索引信息,所以 index 项是不需要提供的
- 如果额外提供了 index 项,那么其将对当前构建的 Series 进行覆盖
# 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)
s
1
2
3
4
5
2
3
4
5
a 1
b 2
c 3
dtype: int64
# DataFrame
DataFrame 由具有共同索引的 Series 按列排列构成(2D),是使用最多的对象,可以将其想象成一个 Excel 表来处理
# 预览
data = [[1,2,3],
[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
df = pd.DataFrame(data=data, index=index, columns=columns)
df
1
2
3
4
5
6
2
3
4
5
6
A | B | C | |
---|---|---|---|
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
df.index # 行索引
1
Index(['a', 'b'], dtype='object')
df.columns # 列索引,与Series的name一个意思
1
Index(['A', 'B', 'C'], dtype='object')
df.values
1
array([[1, 2, 3],
[4, 5, 6]])
df.shape
1
(2, 3)
df.dtypes # dtype加s
1
A int64
B int64
C int64
dtype: object
# 创建
# DataFrame 函数创建
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(data1, index=index1, columns=columns1)
df
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
A | B | C | |
---|---|---|---|
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
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(data2)
df
1
2
3
4
5
2
3
4
5
A | B | C | |
---|---|---|---|
0 | 1 | 2 | 3 |
1 | 4 | 5 | 6 |
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(data3)
df
1
2
3
4
2
3
4
A | B | C | |
---|---|---|---|
a | 1.0 | 2.0 | 3.0 |
b | 4.0 | 5.0 | NaN |
c | NaN | NaN | 6.0 |
# 由 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'
csv_df = pd.read_csv( 'files/csv_test.csv')
csv_df.head()
1
2
2
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
csv_df.index
1
RangeIndex(start=0, stop=244, step=1)
csv_df.columns
1
Index(['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size'], dtype='object')
csv_df.values
1
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 型,选取这一列作为索引。
excel_df = pd.read_excel('files/excel_test.xls')
excel_df.head()
1
2
2
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
上次更新: 2023/11/01, 03:11:44