SOTON私人定制:利用Python进行数据分析(学习pandas)

简介: pandas基础Pandas借鉴了Numpy绝大部分设计思想,但与Numpy不同的是它更适合于处理表格类、异质性数据,而Numpy则是处理同质的数值数组。

pandas基础

Pandas借鉴了Numpy绝大部分设计思想,但与Numpy不同的是它更适合于处理表格类、异质性数据,而Numpy则是处理同质的数值数组。Pandas还能无缝与Numpy, SciPy, statsmodels, scikit-learn, matplotlib等包联用,构建了Python数据分析生态系统。

Pandas最主要的两类数据结构:Series, DataFrame,可以对应R语言的vectordata.frame,脑图如下

img_de84bc560fa0a3c54d041f67f6ad159b.png
DataFrame基础功能

学习笔记如下:

  • pandas的索引对象用于存放轴标签和其他元数据信息,索引对象不可修改,目的是安全的将该索对象传递给其他数据结构。、
  • reindex并不是修改原来的索引,而会在原来的基础上增加新的索引。
  • 对DataFrame或Series修改形状,删除数据的操作默认返回新的数据结构。可以用inplace=True避免返回新的数据,不过这也通常会摧毁原来的数据。
  • 明确lociloc的区别。如果你创建Series或DataFrame的index存在整数,那么细细体会下obj[:1],obj.loc[:1],obj.iloc[:1]
  • 排序和排名(sort and rank)看起来差不多,毕竟排名先要排序,排序之后分配位置,注意重复值的处理方法。

最重要的部分是描述性统计分析部分,这部分依赖于现有的函数

方法 说明
desribe 列计算汇总,列出四分位数等信息
max,min 最大值和最小值
idxmin, idxmax 最大值和最小值的索引位置
quantile 分位数
sum 求和
mean 平均数
median 中位数
mad 根据平均值计算平均离差
var 方差
std 标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的丰度(四阶矩)
cumsum 样本的累积和
cummin,cummax 累计最大值和最小值
cumprod 累积积
diff 计算一阶差分
pct_change 计算百分比变化

官方文档的教程

此处翻译官方文档的10 Minutes to pandas,有任何问题欢迎留言交流。

本文主要简单的介绍了pandas,让新手能够了解pandas的一些功能,你可以在Cookbook中看到更详尽的内容。

在执行以下的操作前,请先导入相应的库:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

创建对象

  • 通过传入一个包含多个值的列表创建一个Series对象,pands会默认为其创建一个整数索引。
s = pd.Series([1,3,5,np.nan,6,8])
  • 通过传入一个含有日期索引和标签列的numpy矩阵创建一个DataFrame对象
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
  • 通过传递一个字典创建一个DataFrame
df2 = pd.DataFrame({ 'A' : 1.,
                   'B' : pd.Timestamp('20130102'),
                   'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                   'D' : np.array([3] * 4,dtype='int32'),
                   'E' : pd.Categorical(["test","train","test","train"]),
                   'F' : 'foo' })

DataFrame和Series具有许多属性,可以利用IPyton的自动补全功能查看:

df2.<TAB>
    df2.A                  df2.boxplot
    df2.abs                df2.C
    df2.add                df2.clip
    df2.add_prefix         df2.clip_lower
    df2.add_suffix         df2.clip_upper
    df2.align              df2.columns
    df2.all                df2.combine
    df2.any                df2.combineAdd
    df2.append             df2.combine_first
    df2.apply              df2.combineMult
    df2.applymap           df2.compound
    df2.as_blocks          df2.consolidate
    df2.asfreq             df2.convert_objects
    df2.as_matrix          df2.copy
    df2.astype             df2.corr
    df2.at                 df2.corrwith
    df2.at_time            df2.count
    df2.axes               df2.cov
    df2.B                  df2.cummax
    df2.between_time       df2.cummin
    df2.bfill              df2.cumprod
    df2.blocks             df2.cumsum
    df2.bool               df2.D

查看数据

  • 假设你有上w条数据,全部显示屏幕要爆炸,那么最好的方法就是只看前面几条或后面几条,验证创建的数据模型是否正确。
df.head()
df.tail(3)
  • 显示索引,列,和底层numpy的数据
df.index
df.columns
df.values
  • 对数据进行快速的统计汇总,这里汇总的数据的数据类型是Int,float这类
df.describe()
img_9e3f650f90365ba6391e6f2ec91b3bd9.png
统计性描述
  • 数据转置

    df.T
    
  • 按轴排序(ascending:升序)

    df.sort_index(axis=1,ascending=False)
    
  • 按值排序,类似于excel的排序

    df.sort_value(by='B')
    

筛选

起步

  • 选择单列,这会产生一个Series,等同于df.A

    df['A']
    
  • 使用[]对行切片

    df[0:3]
    

使用标签筛选

  • 使用标签获取切片数据

    df.loc[date[0]]
    
  • 使用标签获取多轴数据

    df.loc[:,['A','B']]
    
  • 显示标签切片,包括两个端点

    df.loc['20130102':'20130104',['A','B']]
    
  • 获取标量值

    df.loc[dates[0],'A']
    
  • 快速获取标量值(与上一个作用相同)

    df.at[dates[0],'A']
    

通过位置筛选

  • 通过所传递整数的位置选择

    df.iloc[3]
    
  • 通过整数切片

    df.iloc[3:5,2:3]
    
  • 通过整数位地址的列表

    df.iloc[[1,2,4],[0,2]]
    
  • 对行/列切片

    df.iloc[1:3,:]
    df.ilo[:,1,3]
    
  • 获得特定值

      df.iloc[1,1]
    
  • 快速获取标量(与上一个结果相同)

      df.iat[1,2]
    

布尔索引

  • 使用单个列的值来选择数据。

    df[df.A > 0]
    
  • 使用isin()方法进行过滤,下面实现的是筛选E中'tw'和'four'两列

    df2 = df.copy()
    df2['E'] = ['one', 'one','two','three','four','three']
     df2[df2['E'].isin(['two','four'])]
    

赋值

  • 为新列赋值,该列能够通过标签自动匹配原先的数据

    s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
    df['F']=s1
    
  • 通过标签赋值

    df.at[dates[0],'A'] = 0
    
  • 通过位置赋值

    df.iat[0,1] = 0
    
  • 通过传入一个numy矩阵赋值

     df.iat[0,1] = 0
    

缺失值

pandas优先使用np.nan表示缺失值。缺失值默认在计算中排除。

  • 重建索引允许您更改/添加/删除索引上的指定轴。这将返回数据的副本。

    df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
    df1.loc[dates[0]:dates[1],'E'] = 1
    
  • 删除任何包含缺失值的行

    df1.dropna(how='any')
    
  • 填充缺失值

    df1.fillna(value=5)
    
  • 判断是否为缺失值并返回布尔值

    pd.isnull(df1)
    

操作

统计

  • 描述统计
    df.mean() 、 df.mean(1)

apply

  • 将函数应用到数据上

    df.apply(np.cumsum)
    df.apply(lambda x: x.max() - x.min())
    

直方图

 s = pd.Series(np.random.randint(0, 7, size=10))
 s.value_counts()

合并

pandas提供了多种方法方便的合并Series, DataFrame,和Panel对象

Concat

  • 使用concat()串联不同pandas对象

    df = pd.DataFrame(np.random.randn(10, 4))
    pieces = [df[:3], df[3:7], df[7:]]
    pd.concat(pieces)
    

JOIN

  • SQL风格的合并

    left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
    right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
    pd.merge(left, right, on='key')
    

Append

  • 在dataframe中添加行

    df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
    s = df.iloc[3]
    df.append(s, ignore_index=True)
    

分组:Groupin

我们所说'group by'是指以下步骤中的一个或多个处理:

  • 将数据基于一些标准分成多个组
  • 分别应用函数到每个组
  • ** 组合**结果成数据结构
 df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                             'foo', 'bar', 'foo', 'foo'],
                    'B' : ['one', 'one', 'two', 'three',
                              'two', 'two', 'one', 'three'],
                    'C' : np.random.randn(8),
                    'D' : np.random.randn(8)})
  • 分组并对所分的组使用sum函数

    df.groupby('A').sum()
    
  • 通过多列组合形成了一个层次指数,我们再应用函数

    df.groupby(['A','B']).sum()
    

重塑:Reshaping

堆:stack

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
   ....:                      'foo', 'foo', 'qux', 'qux'],
   ....:                     ['one', 'two', 'one', 'two',
   ....:                      'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df2 = df[:4]
df2
img_f90d1b84e953e68f3e6e8fd8de61fed6.png
stack
  • stack()方法“压缩”了DataFrame的层次。

     stacked = df2.stack()
    

数据透视表: Pivot Tables

 df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
   .....:                    'B' : ['A', 'B', 'C'] * 4,
   .....:                    'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
   .....:                    'D' : np.random.randn(12),
   .....:                    'E' : np.random.randn(12)})
   .....: 

我们可以很方便的从这些数据构造数据透视表:

pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])

时间序列<small>Time Series</small>

pandas拥有许多简单,功能强大,高效的功能可以在波动期间执行采样操作(例如,数据转换成二5每分钟的数据)。常见于,但不限于,财务应用 等。

rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts.resample('5Min').sum()

作图: Plotting

画图建议在网页版的jupyter notebook进行操作,减少不必要的烦恼。

  • Series画图方法

    ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
    ts = ts.cumsum()
    ts.plot()
    
  • DataFrame的画图方法

    df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, .....: columns=['A', 'B', 'C', 'D'])
    df = df.cumsum()
    plt.figure(); df.plot(); plt.legend(loc='best')
    
目录
相关文章
|
2月前
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
138 71
|
1天前
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
109 82
|
2月前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
154 73
|
2天前
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
16 3
|
1月前
|
存储 数据采集 数据可视化
Pandas数据应用:医疗数据分析
Pandas是Python中强大的数据操作和分析库,广泛应用于医疗数据分析。本文介绍了使用Pandas进行医疗数据分析的常见问题及解决方案,涵盖数据导入、预处理、清洗、转换、可视化等方面。通过解决文件路径错误、编码不匹配、缺失值处理、异常值识别、分类变量编码等问题,结合Matplotlib等工具实现数据可视化,并提供了解决常见报错的方法。掌握这些技巧可以提高医疗数据分析的效率和准确性。
82 22
|
2月前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
1月前
|
存储 数据挖掘 数据处理
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
47 2
|
1月前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
2月前
|
数据采集 数据可视化 索引
Pandas数据应用:股票数据分析
本文介绍了如何使用Pandas库进行股票数据分析。首先,通过pip安装并导入Pandas库。接着,从本地CSV文件读取股票数据,并解决常见的解析错误。然后,利用head()、info()等函数查看数据基本信息,进行数据清洗,处理缺失值和重复数据。再者,结合Matplotlib和Seaborn进行数据可视化,绘制收盘价折线图。最后,进行时间序列分析,设置日期索引、重采样和计算移动平均线。通过这些步骤,帮助读者掌握Pandas在股票数据分析中的应用。
95 5
|
3月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
116 0

热门文章

最新文章