文章目录
1 Series的创建
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
通过list构建Series | (1)pd.Series(range(10)) ~~~~~~~~ pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5]) ~~~~~~~~ pd.Series(np.arange(5, 10)) (2)pd.Series(range(3), index = [‘a’, ‘b’, ‘c’]) | 新Series | (1)可以传入迭代器 、一维数组 ,自动生成索引(2)自定义索引 |
通过dict构建Series | pd.Series(dict) | 新Series | dict的key为索引,value为元素 |
2 Series的相关操作
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
获取前n行数据 | series.head(3) | 新Series | 获取前三行,默认获取前五行 |
获取后n行数据 | series.tail(3) | 新Series | 获取后三行,默认获取后五行 |
获取index | series.index | RangeIndex | 获取index |
获取values | series.values | ndarray一维数组 | 获取所有values |
算术运算 | series * 2 | 新Series | 索引与数据的对应关系不被运算结果影响 |
逻辑运算 | series > 15 | 新Series(bool) | 索引与数据的对应关系不被运算结果影响 |
name属性 | 对象名:series.name 对象索引名:series.index.name | 新Series | |
利用index取值 | series[index] series[‘b’] | 对应的value值 | |
利用index切片 | series[2:4] series[‘b’:‘d’] | 新Series | 按索引名切片操作时,是包含终止索引的 |
不连续索引 | series[[0,2,4]] series[[‘b’,‘d’]] | 新Series | 注意是双层中括号[[…,…,…,]] |
布尔索引 | series1 = series > 2 series2[series1] | 新Series | |
对值排序 | series.sort_values(ascending=False) | 新Series | ascending:默认True升序,False降序 |
对索引排序 | series.sort_index() | 新Series | ascending:默认True升序,False降序 |
3 DataFrame的创建
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
通过ndarray 构建DataFrame | pd.DataFrame(array) pd.DataFrame(np.random.randn(3,4), columns = [‘a’, ‘b’, ‘c’]) | 新DataFrame | 通过Numpy的ndarray构建, 自动生成行列索引, columns 可指定列索引名 |
通过dict 构建DataFrame | pd.DataFrame(dict) dict = {‘A’: 1, ~~~~~~~~~~ ‘B’: pd.Timestamp(‘20190616’), ~~~~~~~~~~ ‘C’: pd.Series(1, index=list(range(4)),dtype=‘float32’), ~~~~~~~~~~ ‘D’: np.array([3] * 4,dtype=‘int32’), ~~~~~~~~~~ ‘E’: [“Python”,“Java”,“C++”,“C”], ~~~~~~~~~~ ‘F’: ‘tiger’ } | 新DataFrame | dict的key为列标签,value为元素, 自动生成行索引 |
4 DataFrame的相关操作
4.1 DataFrame的基本属性和方法
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
查看shape | dataframe.shape | 元组 | 返回dataframe形状 |
获取前n行 | dataframe.head(3) | 新DataFrame | 获取前三行,默认获取前五行 |
获取后n行 | dataframe.tail(3) | 新DataFrame | 获取后三行,默认获取后五行 |
获取index | dataframe.index | RangeIndex | 获取index |
获取columns | dataframe.columns | RangeIndex | DataFrame的列索引列表 |
获取values | dataframe.values | ndarray二维数组 | 获取所有values |
转置 | dataframe.T | 新DataFrame | |
设置index | data.index = list | 新DataFrame | 按照list的数据内容修改index,必须整体全部修改 ,错误示例:data.index[3] = ‘学生_3’ |
重设新的下标索引 | df.reset_index(drop=False) | 新DataFrame | drop:默认为False,不删除原来索引, 如果为True,删除原来的索引值 |
把某列值设置为新的索引 | df.set_index(keys, drop=True) (1) 以月份设置新的索引: df.set_index(‘month’) (2) 以年和月份设置多个索引: df = df.set_index([‘year’, ‘month’]) | 新DataFrame | keys : 列索引名成或者列索引名称的列表 drop: 默认为False,不删除原来索引, 如果为True,删除原来的索引值 (2)索引类型为MultiIndex层级索引(三维的DataFrame) |
修改数据类型 | dataframe[‘A’].astype(np.float32) | 新Series |
4.2 DataFrame的基本数据操作
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
读取文件 | pd.read_csv(“路径”) | Pandas数据 | |
删除若干列 | dataframe.drop([“a”,“b”,“c”], axis=1) | 新DataFrame | |
删除列数据 | del(dataframe[‘G’]) | None | |
增加列数据 | dataframe[‘G’] = series dataframe[‘G’] = dataframe[‘A’] + 4 | 新DataFrame | 类似Python的dict添加key-value |
对某一列 重新赋值 | dataframe[‘G’] = 100 | 新DataFrame | 指定列所有值均为100 |
对值排序 | df.sort_values(by=“open”, ascending=False) df.sort_values(by=[‘open’, ‘high’]) | 新DataFrame | by:指定排序参考的键, ~~~~~~ 单个键或者多个键进行排序, ascending:默认True升序,False降序 |
对索引排序 | dataframe.sort_index() | 新DataFrame | ascending:默认True升序,False降序 |
获取列数据 | (1)dataframe[‘A’] <=> dataframe.A (2)dataframe[[‘A’]] (3)dataframe[[‘a’,‘c’]] | (1)新Series (2)新DataFrame(只有一列) (3)新DataFrame | (1)通过列索引获取列数据 (2)注意是双层中括号[[…,…,…,]] (3)注意是双层中括号[[…,…,…,]], ~~~~~~~~~ 不连续索引 |
直接获取 某一个值 | dataframe[‘A’] [‘2018-02-27’] | 对应位置的值 | 直接使用行列索引名字的方式(先列后行 ) |
获取行 | dataframe[3: 5](左闭右开) dataframe[‘b’ : ‘d’](左闭右闭) | 新DataFrame | |
获取所有行 | df.itertuples(index=False) |
4.3 DataFrame的高级索引loc、iloc、ix
请参考博文:Pandas中的高级索引loc、iloc、ix精简概括
4.4 DataFrame的运算
a. 运算函数
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
算术运算 | dataframe[‘open’].add(100) dataframe[‘open’].sub(100) | 新Series | 实际上是Series运算 |
逻辑运算 | dataframe[“open”] > 23 | 新Series(bool类型) | |
筛选 | df[df[“open”] > 23] df[(df[“open”] > 23) & (df[“open”] < 24)] | 新DataFrame | 逻辑判断的结果可以作为筛选的依据 |
筛选函数query() | dataframe.query(“open<24 & open>23”) | 新DataFrame | 筛选出符合条件的所有数据 |
筛选函数isin() | dataframe[dataframe[“open”].isin([23.53, 23.85])] | 新DataFrame | 筛选出"open"列中值为23.53和23.85的所有数据 |
b. 统计运算函数
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
describe() | 描述 | count() | 非NaN个数 |
sum() | 求和 | prod() | 所有元素的乘积 |
mean() | 平均值 | abs() | 绝对值 |
min() | 最小值 | max() | 最大值 |
std() | 标准差 | var() | 方差 |
median() | 中位数 | mode() | 众数 |
idxmax() | 最大值的索引标签 | idxmin() | 最小值的索引标签 |
cumsum() | 计算前1/2/3/…/n个数的和 | cumprod() | 计算前1/2/3/…/n个数的积 |
cummin() | 计算前1/2/3/…/n个数的最小值 | cummax() | 计算前1/2/3/…/n个数的最大值 |
中位数:为将数据从小到大排列,在最中间的那个数为中位数。如果没有中间数,取中间两个数的平均值。
c. 自定义运算
apply(func, axis=0)
func:自定义函数;默认是列axis=0,对行进行运算axis=1。
示例:对’open’, 'close’两列进行自定义运算
>>>data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0) # 返回Series
===运行结果:======================================
open 22.74
close 22.85
dtype: float64
5 高级操作
5.1 缺失值处理
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
替换字符 例"?" | data.replace(to_replace="?", value=np.NaN) | 新DataFrame | to_replace:替换前的值 value:替换后的值 |
判断缺失值 是否存在 | (1)pd.notnull(dataframe) (2)np.all(pd.notnull(dataframe)) (3)pd.isnull(dataframe) (4)np.any(pd.isnull(dataframe)) | (1)新DataFrame(bool类型) (2)True/False (3)新DataFrame(bool类型) (4)True/False | (1) (2)里面如果有一个缺失值,就返回False (3) (4)里面如果有一个缺失值,就返回True |
删除缺失值 | data.dropna() | 新DataFrame | 使用dropna的前提: 缺失值的类型必须是np.nan |
填充缺失值 | data[" “].fillna(data[” "].mean(), inplace=True) | 新DataFrame | inplace: True:会修改原数据, False:不替换修改原数据,生成新的对象 |
5.2 数据离散化
- 可以用来减少给定连续属性值的个数
- 在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
自行分组 | pd.qcut(data[" "], q).value_counts() | 新Series | 将数据分组,参数q为组数 一般会与value_counts搭配使用,统计每组的个数 |
自定义区间分组 | bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100] pd.cut(data[" "], bins).value_counts() | 新Series | |
将分组数据变成 one-hot编码矩阵 (哑变量矩阵) | pd.get_dummies(data[" "], prefix=“前缀”) | 新DataFrame | data:array-like, Series, or DataFrame prefix:分组名字 |
5.3 数据合并(concat、merge)
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
5.3.1 pd.concat实现数据合并
pd.concat([data1, data2], axis=1)
按照行或列进行合并,axis=0为列索引,axis=1为行索引
5.3.2 pd.merge实现数据合并
pd.merge(left, right, how='inner', on=None)
可以指定按照两组数据的共同键值对合并或者左右各自
left: DataFrame
right: 另一个DataFrame
on: 指定的共同键
how:按照什么方式连接
a. 内连接
查询两个表中符合条件的共有记录。
b. 外连接
两个表中所有记录都保留;两个表不存在的数据,使用np.NaN值填充。
c. 左连接
以左表为主,根据条件查询右表数据;左表数据全部保留,右表不存在的数据,使用np.NaN值填充。
d. 右连接
以右表为主,根据条件查询左表数据;右表数据全部保留,左表不存在的数据,使用np.NaN值填充
5.4 分组与聚合
DataFrame.groupby(key, as_index=False)
key:分组的列数据,可以多个
案例:不同颜色的不同笔的价格数据
进行分组,对颜色分组,对价格进行聚合
>>>col =pd.DataFrame({'color': ['white','red','green','red','green'],
'object': ['pen','pencil','pencil','ashtray','pen'],
'price1':[5.56,4.20,1.30,0.56,2.75],
'price2':[4.75,4.12,1.60,0.75,3.15]})
color object price1 price2
0 white pen 5.56 4.75
1 red pencil 4.20 4.12
2 green pencil 1.30 1.60
3 red ashtray 0.56 0.75
4 green pen 2.75 3.15
- a(与b效果相同)
>>>col.groupby(['color'])['price1'].mean()
color
green 2.025
red 2.380
white 5.560
Name: price1, dtype: float64
- b
>>>col['price1'].groupby(col['color']).mean()
color
green 2.025
red 2.380
white 5.560
Name: price1, dtype: float64
- c 添加参数
as_index=False
后,注意数据的结构的变化
>>>col.groupby(['color'], as_index=False)['price1'].mean()
color price1
0 green 2.025
1 red 2.380
2 white 5.560
- d
agg()
----aggregation
聚合函数
dataset.groupby('color').agg([list])
5.5 交叉表与透视表
交叉表:用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
pd.crosstab(df["A"], df["B"])
透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
dataframe.pivot_table([], index=[])
5.6 文件的读取与存储
- CSV、HDF5、JSON文件的读取与存储
操作 | 代码实现 | 返回值 | 说明 |
---|---|---|---|
读取pd.read_*() | pd.read_csv(“路径”, usecols=[‘open’, ‘close’]) | DataFrame | *可以是csv、hdf、json |
dataframe.to_*() | dataframe.to_csv(“路径”, columns=[‘open’]) | None | *可以是csv、hdf、json |