import pandas as pd
import numpy as np
Contents
- 数据结构 Series
- 数据结构 DateFrame
- DataFrame 和 Series 中的 Index
- 常用的 Merge,Join 和 Concatenate
- Group By
- 文件读取
1. 数据结构 Series
在 pandas 中,Series 是一个一维的数据结构
s = pd.Series([3, 5, 3.1], index = ['A', 'B', 'C'])
可以通过 index 像数组一样对 s 中的元素进行访问和赋值操作,没有 index 参数时默认从 0 ~ n-1 作为索引。此时通过type(s)
会得到 s 的类型为 pandas.core.series.Series。由于 Series 本来就是键-值对形式的数据,所以可以直接用 dict 来构造 Series,pd.Series(a)
,其中 a 是一个字典。s[s < 4]
通过 boolean indexing 将 s 中小于 4 的数据筛选出来,s < 4
会在 s 中满足条件的位置返回 True, 不满足条件的返回 False。s[s < 4] = 1
会将 s 满足条件的部分数据值都更新为1。- 基本数学运算。
s / 2
,s * 2
,np.square(s)
,s ** 2
都是合法的语法。如果要对两个 Series 进行加减乘除运算时,必需要求两个 Series 的 index 相同(运算作用在两个 Series 相同的 index 上)。 a in s
检索元素 a 是否在 s 中(如果 a 是浮点类型的则不能判断)。s.notnull()
将 s 中元素非空的位置处返回 True,元素为空的位置处返回 False。s.isnull()
也是同样的道理,可以通过s[s.isnull() == False]
来完成对空数据项的过滤。s.to_frame()
可以将 Series 转化成 Dataframe。
2. 数据结构 DataFrame
一个 DataFrame 就是一张表格, Series 表示的就是表格中某一列数据,DateFrame 可以看做是一组 Series 的集合。
先构造一个 DataFrame 格式的表格:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import pandas as pd
data = {'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou', 'Chongqing'],
'year': [2016,2017,2016,2017,2016, 2016],
'population': [2100, 2300, 1000, 700, 500, 500]}
df = pd.DataFrame(data, columns = ['year', 'city', 'population', 'debt'],
index=['one', 'two', 'three', 'four', 'five', 'six'])
print(df)
"""
year city population debt
---------------------------------------------
one 2016 Beijing 2100 NaN
two 2017 Shanghai 2300 NaN
three 2017 Guangzhou 1000 NaN
four 2017 Shenzhen 700 NaN
five 2016 Hangzhou 500 NaN
six 2016 Chongqing 500 NaN
"""
df = pd.DataFrame(data, columns = list_1, index = list_2)
构造一个 DataFrame 格式的数据表格,其中 data 可以是一个 dict, 通过list_1 中的元素顺序可以指定 DataFrame 表格中列属性名的先后顺序,通过 list_2 中的元素可以设定 DataFrame 中索引。df.columns
和df.index
分别获 DataFrame 的列名和索引,返回的数据格式为 pandas.core.indexes.base.Index,可以类似访问数组的方式访问 Index,但 Index 的值是不可被更改的。也可以通过df.columns = ['A','B','C','D','E']
来更爱列名。df.T
可以是 DataFrame 像矩阵一样进行转置,原来的列名变成索引,原来的索引变成列名。- DataFrame 列的选择。
df['city']
或df.city
得到一个带 index 的 Series 格式的数据。 - DataFrame 行的选择。
df.loc['three']
或df.iloc[2]
得到一个 带index 的 Series 格式数据,index 为 DataFrame 列属性名。 - DataFrame 中元素赋值。
df['city']['one'] = "China"
注意,此处先通过列名选出一个 Series,再通过该 Series 的 index 来访问元素。在这过程中因为是对切片进行赋值,所以程序会有 Warning,直接忽略即可。df['city'] = "China"
则会将 DataFrame 中的整个 city 列都更新为 “China”。同理df.loc['two'] = 0
也会将 DateFrame 中 index 为 “two” 的整行元素都赋值为 0。当然可以通过将一个 list(或 Series) 赋值给整行或整列,但要求长度一致(用 Series 进行赋值时,会根据 index 进行匹配, 没有命中的项会被设置为 NaN),否则会出错。 df.index.name = 'index_name'
和 `df.columns.name = ‘columns_name’ 可以指定索引的名字和列名字。df.values
返回的是 numpy 的 ndarray 格式的数据(二维)。- DataFrame 也可以通过条件进行筛选。如
df[df.population > 1000]
或df[df['population'] > 1000]
。
3. DataFrame 和 Series 中的 index
- Index 中的值不可以被修改
- 可以对 Index 进行索引和切片,例如
s = pd.Series([3, 5, 3.1], index = ['A', 'B', 'C'])
可以通过s[['B','A']]
或s[[1,0]]
对 Series 中的值进行索引,可见 重命名 index 后的 Series,默认的数字 index 依旧可以使用。通过s[0:2]
或s['A':'C']
对 Index 进行切片。对 DateFrame 格式数据进行切片可用df.loc['one':'three']
或df.iloc[0:2]
,也可以用df.['one':'three']
或df[0:2]
。注意:用 loc 索引是包含最后一个元素,用 iloc 索引时则不包含。 df.reindex(['A','B','C'])
重新给 DataFrame 或 Series格式数据的 Index 赋值。df.drop(['year','city'], axis=0)
,`df.drop([‘one’,’two’]) 分别完成 DateFrame 中的 列属性和索引删除。- 多索引(MultiIndex)的 Series 可以通过 unstack() 和 stack() 函数与 DataFrame 格式之间相互转化。
4.常用的 Merge, Join 和 Concatenate
5. Group By
1 | salaries = pd.DataFrame({ |
g = salaries.groupby('Name')
会得到一个pandas.core.groupby.DataFrameGroupBy 类型的数据,常常与 aggregate 一起使用。g.aggregate(sum)
也可写作g.sum()
,除了 sum 还有 max,min,size。g.describe()
能够获得分组的统计信息。同样也可以根据多个列属性进行分组。
1 | g = salaries.groupby('Name') |
6. 文件读取
data = pd.read_csv("data.csv", encoding = 'latin1', sep=';', parse_dates=['Date'], index_col='Date')
中列举了几个常用的参数。data.dropna()
会删除 data 中所有带 NA 的行。当然 dropna() 函数中还有 how,axis等参数可供设置。- datetime 格式的时间数据中有 weekday,year,date,day等属性,详细点击这里