1. import pandas as pd
  2. import numpy as np

导入文件

  1. df = pd.read_excel("sample-salesv3.xlsx")

快速浏览一下数据类型,以确保所以事情都能如预期一样运行。

  1. print(df.dtypes)
  2. #output
  3. account number int64
  4. name object
  5. sku object
  6. quantity int64
  7. unit price float64
  8. ext price float64
  9. date object
  10. dtype: object

将 date 列转换为日期对象:

  1. df['date'] = pd.to_datetime(df['date'])
  2. print(df.dtypes)
  3. #output
  4. account number int64
  5. name object
  6. sku object
  7. quantity int64
  8. unit price float64
  9. ext price float64
  10. date datetime64[ns]
  11. dtype: object
  12. #现在,data变成了一个datetime类型的对象。

筛选数据

使用pandas来筛选和选择某个特定数据的子集。

操作 Excel 文件 - 图1

根据字段的值来筛选

  1. #根据字段的值来筛选。使用head函数来显示前面几个结果,这仅仅是为了让本文保持简短。
  2. df[df["account number"]==307599].head()
  3. #还可以以数值为基准来进行筛选
  4. df[df["quantity"] > 22].head()

复杂筛选

  1. #从B1中查找以“sku”中起始的项目
  2. df[df["sku"].map(lambda x: x.startswith('B1'))].head()

把两个或更多的语句连接起来很简单,用&就可以

  1. df[df["sku"].map(lambda x: x.startswith('B1')) & (df["quantity"] > 22)].head()

pandas支持的另外一个很有用的函数是isin。它使得我们可以定义一个列表,里面包含我们所希望查找的值。
在这个例子中,我们查找包含两个特定account number值的全部项目。

  1. df[df["account number"].isin([714466,218895])].head()

pandas支持的另外一个函数叫做query,它使得我们可以有效的在数据集中选择数据。使用它需要安装numexpr,所以请确保你在进行下面步骤前已经进行了安装。如果你想要通过名字来得到一个消费者列表,你可以使用query来完成,和前面展示的python语法类似。

  1. df.query('name == ["Kulas Inc","Barton LLC"]').head()

处理日期

使用pandas,你可以对日期进行更加复杂的筛选。在我们处理日期前,我建议你把日期栏进行一个排序,以便返回的结果如你所愿。

  1. df = df.sort('date')
  2. df.head()

在操作日期前,为您展示python的筛选语法。

  1. df[df['date'] >='20140905'].head()

pandas的一个特别棒的特性是它能够理解日期,所以它允许我们进行部分筛选。如果我只想要查看最近几个月的日期数据,我可以这样做。

  1. df[df['date'] >='2014-03'].head()

当然,你可以把筛选标准链接起来。

  1. df[(df['date'] >='20140701') & (df['date'] <= '20140715')].head()

由于pandas可以理解日期列,所以可以将日期值设为不同的格式,都会得到正确的结果。

  1. df[df['date'] &gt;= '10-10-2014'].head()

当操作时间序列数据时,如果你把数据进行转化,以日期作为索引,我们可以做一些变相的筛选。
使用set_index 来设置新的索引。

  1. df2 = df.set_index(['date'])
  2. df2.head()

你可以通过切分数据来获取一段区间。

  1. df2["20140101":"20140201"].head()

http://python.jobbole.com/80972/