ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## Pandas ### Series 和 DataFrame ``` import pandas as pd import numpy as np from pandas import Series, DataFrame ``` * Series 序列 列和行索引,相当于一维数组 * DataFrame 数据帧 列和行 行索引和列标签 相当于二维数组 * 自动对齐 时间序列 缺失补全 * 1 创建序列 * 创建序列 * 创建序列指定索引 * 指定索引名 ``` s1 = Series([1, 2, 3, 4, 5]) s1 s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) s2 s2.index.name = 'index' s2.index ``` * rand 0-1 随机均匀分布 * randn 标准状态分布 均值0 方差1 * 2 创建数据帧 * 指定索引 指定标签 * 查看索引 * 查看标签 ``` df = DataFrame(np.random.rand(4, 4), index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D']) df df.index df.columns ``` ### 选择 * 3 序列选择 * 通过序列索引 * 通过自定义索引 * 通过序列索引切片 * 通过自定义索引切片 * 通过序列.iloc(序列索引) * 通过序列.loc(自定义索引) ``` s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) s2 s2[0] s2['a'] s2[0:3] s2['a':'c'] s2.iloc[0:3] s2.loc['a':'c'] ``` * 4 数据帧获取列 * 获取数据帧某列 数据帧.列标签 * 获取数据帧多列 数据帧[数据帧.columns[index]] ``` df df.A df['A'] df[df.columns[0:2]] ``` * 5 数据帧获取多行 * 获取数据帧某行 数据帧.loc[行自定义索引] * 获取数据帧某行 数据帧.iloc[行索引] * 获取数据帧多行 数据帧.loc[自定义索引:] ``` df df.loc['a'] df.loc['a':'b'] df.iloc[0] ``` * 6 数据帧获取多列 * 获取数据帧多列 数据帧.loc[:,自定义列标签] * 获取数据帧某个具体位置值 数据帧.loc[行索引,列标签] * 获取数据帧部分 数据帧.loc[行索引:,列标签:] ``` df.loc[:, ['B', 'C', 'D']] df df.loc['a', 'A'] df.loc['b':'c', 'B':'C'] ``` ### 缺失值和数据自动对齐 * 7 序列缺失值 * 产生缺失值 两个序列索引不一样运算产生缺失值 * 求和时 缺失值补全 ``` s1 = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) s1 s2 = Series([2, 3, 4, 5], index=['b', 'c', 'd', 'e']) s2 s1 + s2 s1.add(s2,fill_value=0) ``` * 8 数据帧缺失值 * 产生缺失值 两个数据帧 形状 行索引 列标签不一样产生缺失值 * 求和时 缺失值补全 ``` df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc')) df2 = DataFrame(np.arange(12).reshape(3,4), columns=list('ABDE'), index=list('bcd')) df1 df2 df1 + df2 df1.add(df2, fill_value=0) ``` ### 常用运算 * `apply()` 作用于一维向量上 * `applymap()` 作用于所有元素上 * 9 数据帧运算 * 数据帧应用匿名函数列应用 * 数据帧应用匿名函数行应用 ``` df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc')) df1 f = lambda x: x.max() - x.min() df1.apply(f) df1.apply(f, axis=1) ``` * 10 数据帧运算 * 数据帧应用匿名函数作用所有元素 ``` df1.applymap(lambda x: x+1) ``` ### 常用统计 * 11 数据帧统计运算 * 列元素求和 * 行元素求和 * 求平均 * 查看统计元素 ``` df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc')) df1 df1.sum() df1.mean() df1.sum(axis=1) df1.describe() ``` ### 数据合并和分组 * 12 数据帧 * 两个数据帧拼接 ``` df1 = DataFrame(np.random.randn(3, 3)) df2 = DataFrame(np.random.randn(3, 3), index=[5, 6, 7]) df1 df2 pd.concat([df1, df2]) ``` * 13 数据帧 * 两个数据帧合并 ``` df1 = DataFrame({'user_id': [5348, 13], 'course': [12, 45], 'minutes': [9, 36]}) df2 = DataFrame({'course': [12, 45], 'name': ['Linux 基础入门', '数据分析']}) df1 df2 pd.merge(df1, df2) ``` * 14 数据帧数据统计 * 指定标签值 标签值求和 * 找出指定id,minutes标签值求和 ``` df = DataFrame({'user_id': [5348, 13, 5348], 'course': [12, 45, 23], 'minutes': [9, 36, 45]}) df df[df['user_id'] == 5348]['minutes'] df[df['user_id'] == 5348] df[df['user_id'] == 5348]['minutes'].sum() ``` * 15 数据帧数据统计 * 过来列id,minute 通过id分组求和 ``` df[['user_id', 'minutes']] df[['user_id', 'minutes']].groupby('user_id').sum() ``` ### 时间序列处理 * datetime.datetime 代表时间对象 * datetime.date 代表某一天 * datetime.timedelta 时间差 * 16 时间对象 * 创建时间对象 datetime(年,月,日) * 加上时间间隔 ``` from datetime import datetime, timedelta d1 = datetime(2017, 8, 1) d1 delta = timedelta(days=10) d1 + delta ``` * 17 创建序列 * 创建序列加上时间索引 * 查看序列索引 ``` from datetime import datetime dates = [datetime(2018, 1, 1), datetime(2018, 1, 2), datetime(2018, 1, 3), datetime(2018, 1,4)] ts = Series(np.random.randn(4), index=dates) ts ts.index ts.index[0] ``` * 18 时间序列索引使用 * 通过时间序列索引找对应的值 ``` ts.index[0] ts[ts.index[0]] ts['2018-01-01'] ts['2018/01/01'] ts['1/1/2018'] ts[datetime(2018, 1, 1)] ``` * 19 使用pandas生成日期索引 * date_range(起始,结束,freq频率) ``` pd.date_range('2018-1-1', '2019', freq='M') pd.date_range('2018-1-1', '2018-12-1', freq='MS') ``` * 20 生成时间索引序列 * 使用date_range生成时间索引 频率为小时 * 使用Series生成时间日期序列 ``` dates = pd.date_range('2018-1-1', '2018-1-2 23:00:00', freq='H') ts = Series(np.arange(len(dates)), index=dates) ts.size ts.head(5) ts.tail(5) ``` * 21 高低频统计转化 * 高频转为低频H转为D,求和 * 高频转为低频,求平均 * 高频转低频求平均再转高频求平均 * 高频转低频求平均再转高频求平均无效填充 ``` ts.resample('D').sum() ts.resample('D').mean() ts.resample('D').mean().resample('H').mean() ts.resample('D').mean().resample('H').ffill() ```