python

    xiaoxiao2022-07-07  215

    excel文件下载地址: 链接:https://pan.baidu.com/s/1EkuKBPKnJW1muAGTVcVj7Q 提取码:dmjn

    import pandas as pd import numpy as np from pandas import Series, DataFrame """ DataFrame数据框 输出类型为DataFrame 二维的表格型数据结构,输出内容与mysql类似,有列名以及行索引。可以将DataFrame理解为Series的容器。 """ # 方式一:通过字典方式创建 dataf = {'lie1': ['a', 'b', 'c'], 'lie2': [11, 33, 22]} f1 = DataFrame(dataf) # 转化为DataFrame形式 print f1 f2 = DataFrame(dataf, columns=['lie1', 'lie2']) # 自定义输出列顺序 print f2 f3 = DataFrame(dataf, columns=['lie1', 'lie2'], index=['a1', 'a2', 'a3']) # 自定义索引名称 print f3 # 方式二:通过嵌套字典方式创建 dataf2 = {'lie1': {'hang1': 'py', 'hang2': 'java'}, 'lie2': {'hang1': 20, 'hang2': 30}} # dataf2 = {'lie1': {'hang1': 'py', 'hang2': 'java'}, 'lie2': {'hang1': 20}} d1 = DataFrame(dataf2) print d1 d2 = DataFrame(dataf2, columns=['lie1', 'b', 'c']) # 生成新的DataFrame,没有定义值的列为NaN print d2 d2['b'] = Series(['A', 'B'], index=['hang1', 'hang2']) # 修改某一列的值 d2['c']['hang2'] = 30 # 修改某一个数值 print d2 # 方式三:通过二维数组创建 arr = np.array(np.random.randint(0, 50, 12)).reshape(3, 4) # 随机生成0-50的12个数字,转化为三行四列 df = pd.DataFrame(arr) print df print type(df) # 统计分析 d1 = pd.Series(3*np.random.normal(size=50)+10) # 生成50个正态分布的数据,并乘以3,且加10,转化为Series d2 = np.random.f(2, 5, size=50) # 从F分布中抽取样本。2为组间自由度,4为组内自由度,50为数量 d3 = np.random.randint(1, 100, size=50) # 生成50个1-100的整数 d = pd.DataFrame(np.array([d1, d2, d3]).T, columns=['x1', 'x2', 'x3']) print '3行50列的二维数组:\n', np.array([d1, d2, d3]) # 3行50列的二维数组 print '转置为50行3列的二维数组:\n', np.array([d1, d2, d3]).T # 转置为50行3列的二维数组 print 'df.head():\n', df.head() # 定义一个函数:用于生成所有的统计描述指标 def describe_all(xx): return pd.Series([xx.count(), xx.min(), xx.idxmin(), xx.quantile(0.25), xx.median(), xx.quantile(0.75), xx.mean(), xx.max(), xx.idxmax(), xx.mad(), xx.var(), xx.std(), xx.skew(), xx.kurt()], index=['Count', 'Min', 'Whicn_Min', 'Q1', 'Median', 'Q3', 'Mean', 'Max', 'Which_Max', 'Mad', 'Var', 'Std', 'Skew', 'Kurt']) print d.apply(describe_all) # 对DataFrame的每一列都生成对应的统计描述指标 # 增删改 dic1 = {'lie1': {'hang1': 'aa', 'hang2': 'bb', 'hang3': 'cc'}, 'lie2': {'hang1': 20, 'hang2': 30, 'hang3': 40}} df1 = pd.DataFrame(dic1) dic2 = {'lie1': {'hang4': 'cc', 'hang5': 'dd', 'hang6': 'ee'}, 'lie2': {'hang4': 50, 'hang6': 70}} df2 = pd.DataFrame(dic2) # 新增:df2的数据加到df1中 df = pd.concat([df1, df2]) print df # 删除 # del df # 删除对象 print df.drop(['hang4', 'hang6'], axis=0) # 删除行,不影响原来的数据。默认axis=0,表示删除行。 print df.drop(['lie1'], axis=1) # 删除列,不影响原来的数据 print df[df['lie2'] > 50] # 等价于删除lie2<=50的数据 print df # 修改数值 df.ix[df['lie1'] == 'aa', 'lie2'] = 2000 print df # 修改列名columns df.rename(columns={'lie1': 'a', 'lie2': 'b'}, inplace=True) print df # 修改行名index print df.reset_index() # 行名变为原始的数字 print df # 聚合groupby() dic1 = {'lie1': {'hang1': 'aa', 'hang2': 'bb', 'hang3': 'cc'}, 'lie2': {'hang1': 20, 'hang2': 30, 'hang3': 40}, 'lie3': {'hang1': '男', 'hang2': '男', 'hang3': '女'}, 'lie4':{'hang1': 2, 'hang2': 4, 'hang3': 2}} df1 = pd.DataFrame(dic1) dic2 = {'lie1': {'hang4': 'cc', 'hang5': 'dd', 'hang6': 'ee'}, 'lie2': {'hang4': 50, 'hang6': 60, 'hang6': 70}, 'lie3': {'hang4': '女', 'hang5': '男', 'hang6': '女'}, 'lie4':{'hang1': 4, 'hang2': 5, 'hang3': 6}} df2 = pd.DataFrame(dic2) df = pd.concat([df1, df2]) print df print '聚合1:\n', df.groupby('lie3').mean() # 按照lie3分组,自动计算各数值型的组内均值 print '聚合2:\n', df.groupby(['lie3', 'lie4']).mean() # 按照lie3、lie4分组,自动计算各数值型的组内均值 print '聚合3:\n', df.drop('lie4', axis=1).groupby('lie3').mean() # 按照lie3分组,剔除列4后,自动计算各数值型的组内均值 print '聚合4:\n', df.drop('lie4', axis=1).groupby('lie3').agg([np.mean, np.median]) # 按照lie3分组,剔除列4后,自动计算各数值型的组内均值mean以及中位数median # 排序:sort_index、sort_values print '升序:\n', df.sort_values(by=['lie2', 'lie4']) # 根据指定列的值排序,默认为升序 print '降序:\n', df.sort_values(by=['lie2', 'lie4'], ascending=False) # 根据指定列的值排序,按照降序排序 print '索引升序:\n', df.sort_index() # 根据索引排序,默认为升序 print '索引降序:\n', df.sort_index(ascending=False) # 根据索引排序,按照降序排序 # 多表关联:merge df1 = pd.DataFrame({'lie1': ['a', 'b', 'a', 'b', 'b'], 'lie2': range(5)}) print df1 df2 = pd.DataFrame({'lie1': ['a', 'c', 'c', 'c', 'c'], 'lie3': range(5)}) print df2 result1 = pd.merge(df1, df2) # 默认是两个表之间的内连接,关联条件为相同列名lie1。等价于 select * from df1 inner join df2 on df1.lie1=df2.lie1 print result1 result2 = pd.merge(df1, df2, how='left', left_on='lie2', right_on='lie3') # left为左连接;right为右连接;outer为外连接。等价于 select * from df1 left join df2 on df1.lie2=df2.lie3 print result2 """ 缺失值处理:删除、填补、插值 1、删除法: 当数据中的某个变量大部分值都是缺失值,可以删除这个变量(列); 当缺失值是随机分布的且缺失的数量并不是很多时,也可以删除这些缺失的观测值(行)。 2、替补法: 对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值; 如果变量是有偏的,可以使用中位数来代替那些缺失值; 对于离散型变量,我们一般用众数去替换那些存在缺失的观测。 相对于常数填充或前项、后项填充,使用各列的众数、均值或中位数填充要更加合理一点 3、插补法: 插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。 """ # 删除法 s = pd.Series([1, np.NaN, 'aa', np.NaN], index=['a', 'b', 'c', 'd']) print s print sum(pd.isnull(s)) # 查询有多少个缺失值 print s.dropna() # 删除有缺失值的行,不影响原数据s print s dic1 = {'lie1': {'hang1': 'aa', 'hang2': 'aa', 'hang3': 'cc', 'hang4': 'aa'}, 'lie2': {'hang1': 40, 'hang2': np.NaN, 'hang3': np.NaN, 'hang4': 40}, 'lie3': {'hang1': '男', 'hang2': np.NaN, 'hang3': '女', 'hang4': '男'}, 'lie4':{'hang1': 2, 'hang2': np.NaN, 'hang3': 2, 'hang4': 2}} df1 = pd.DataFrame(dic1) print df1.dropna() # 删除有缺失值的行,不影响原数据df1。只要一行中有一个值缺失,就会删除掉 print df1.dropna(how='all') # 删除有缺失值的行,不影响原数据df1。只会删除该行全部值缺失的 print df1 print df1['lie2'].dropna() # 删除指定列的缺失行 # 替补法 # 方法一、使用0替补空值,不影响原来的数据df1 print '使用0替补空值:\n', df1.fillna(0) # 方法二、使用常量填充不同的列 print '使用常量填充不同的列:\n', df1.fillna({'lie1': 1111, 'lie2': 2222, 'lie3': 3333, 'lie4': 4444}) # 方法三、使用均值或中位数填充各自的列 dic = {'lie1': {'hang1': 22.0, 'hang2': 33, 'hang3': 22, 'hang4': 22}, 'lie2': {'hang1': 40, 'hang2': np.NaN, 'hang3': np.NaN, 'hang4': 40}, 'lie3': {'hang1': 22, 'hang2': np.NaN, 'hang3': 22, 'hang4': 22}, 'lie4':{'hang1': 2, 'hang2': 5, 'hang3': 2, 'hang4': 2}} df = pd.DataFrame(dic) lie1_median = df['lie1'].median() print 'lie1_mode', lie1_median lie2_median = df['lie2'].median() print 'lie2_median', lie2_median lie3_mean = df['lie3'].mean() print 'lie3_mode', lie3_mean lie4_mean = df['lie2'].mean() print 'lie4_mean', lie4_mean print '使用均值或中位数填充各自的列:\n', df.fillna({'lie1': lie1_median, 'lie2': lie2_median, 'lie3': lie3_mean, 'lie4': lie4_mean}) # 方法四、用前一个观测值填充,若前一个观测值为空,则依然空 print '用前一个观测值填充:\n', df1.fillna(method='ffill') # 方法五、用后一个观测值填充,若后一个观测值为空,则依然空 print '用后一个观测值填充:\n', df1.fillna(method='bfill') print df1 """ 数据替换 """ data = pd.Series([1, -111, 5, -56, -9999]) print '-----数据替换-----' print data.replace(-9999, np.NaN) # 用np.NaN替换-999,不改变原来的Series print data.replace([1, -9999], np.NaN) # 用np.NaN替换1、-999,不改变原来的Series print data.replace([1, -9999], [np.NaN, 0]) # 用np.NaN、0分别替换1、-999,不改变原来的Series print data """ 数据转换: 1、移除重复数据 2、利用函数或映射进行数据转换 """ # 方法一、移除重复数据 data = pd.DataFrame({'lie1': ['a', 'b'] * 3 + ['b'], 'lie2': [1, 1, 2, 3, 3, 4, 4]}) print data print data.duplicated() # 返回一个布尔型Series,表示各行是否是重复行(前面出现过的行)。判断数据是否重复,如果重复返回True,不重复返回False print data.drop_duplicates() # 返回一个DataFrame,重复的数组会标为False且不显示出来 print data.drop_duplicates(['lie2']) # 根据lie2去除重复值(默认保留第一个出现的值的组合),返回一个DataFrame print data.drop_duplicates(['lie1', 'lie2'], keep='last') # 根据lie1、lie2去除重复值(保留最后一个出现的组合),返回一个DataFrame # 方法二、利用函数或映射进行数据转换 data = pd.DataFrame({'food': ['aa', 'Aa', 'BB'], 'price': [4, 3, 6]}) meat_to_animal = {'aa': 'a', 'bb': 'b'} lowerdata = data['food'].str.lower() # 将data的food列全都转换为小写 data['type'] = lowerdata.map(meat_to_animal) # 往data中拼接type print data data['food'].map(lambda x: meat_to_animal[x.lower()]) print data """ 数据透视表 """ dic1 = {'age': {'hang1': 11, 'hang2': 11, 'hang3': 20, 'hang4': 15}, 'lie2': {'hang1': 40, 'hang2': 30, 'hang3': 20, 'hang4': 40}, 'sex': {'hang1': '男', 'hang2': '男', 'hang3': '女', 'hang4': '男'}, 'lie4':{'hang1': 2, 'hang2': 6, 'hang3': 4, 'hang4': 2}} df1 = pd.DataFrame(dic1) print '数据透视表:\n', df1 print pd.pivot_table(df1, values=['lie2', 'lie4'], columns=['age', 'sex']) # 按照age跟sex分组,得到lie2跟lie4 print pd.pivot_table(df1, values=['lie2', 'lie4'], columns=['age', 'sex']).unstack() # 转化为列联表 print pd.pivot_table(df1, values=['lie2', 'lie4'], columns=['age', 'sex'], aggfunc=[np.mean, np.median, np.std]) # 求多个值 """ 多层索引:可以理解为excel中的合并单元格后的大标题 """ df = pd.DataFrame(np.random.randint(10, 100, 20).reshape(5, 4), index=[['A', 'A', 'A', 'B', 'B'], [1, 2, 3, 1, 2]], columns=[['X', 'X', 'X', 'Y'], ['x1', 'x2', 'x3', 'y']]) print '多层索引:\n', df print df['X'] # 取出列索引为X的数据 print df.ix[['A'], :] # 取出行索引为A的数据 # 相关分析 x = [52, 19, 7, 33, 2] y = [162, 61, 22, 100, 6] xmean = np.mean(x) ymean = np.mean(y) xsd = np.std(x) ysd = np.std(y) zx = (x - xmean) / xsd zy = (y - ymean) / ysd r = np.sum(zx * zy) / len(x) print r r = np.corrcoef(x, y) print r data = pd.DataFrame({'X': x, 'Y': y}) r = data.corr() print r # 绘图 import matplotlib.pyplot as plt data1 = np.arange(10) print data1 plt.plot(data1) plt.xlabel('month') plt.ylabel('order') plt.title('tu_xing') plt.show() fig = plt.figure() ax1 = fig.add_subplot(2, 2, 1) ax1 = fig.add_subplot(2, 2, 2) ax1 = fig.add_subplot(2, 2, 3) plt.plot(np.random.rand(50).cumsum(), 'k--')
    最新回复(0)