pandas excel筛选

导入pandas和numpy模块。

Python

 

1

2

import pandas as pd

import numpy as np

导入我们样本公司销售年销售额的Excel文件。

Python

 

1

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

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

Python

 

1

df.dtypes

 

Python

 

1

2

3

4

5

6

7

8

account number int64

name object

sku object

quantity int64

unit price float64

ext price float64

date object

dtype: object

你会注意到,我们的date列,显示的是一个通用对象。我们准备把它转换为日期对象,来简化将来会用到的一些选择操作。

Python

 

1

2

df['date'] = pd.to_datetime(df['date'])

df.head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
1714466Trantow-BarrowsS2-77896-163.16-63.162014-01-01 10:00:47
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
3307599Kassulke, Ondricka and MetzS1-654814121.05863.052014-01-01 15:05:22
4412290Jerde-HilpertS2-34077683.21499.262014-01-01 23:26:55

 

Python

 

1

df.dtypes

 

Python

 

1

2

3

4

5

6

7

8

account number int64

name object

sku object

quantity int64

unit price float64

ext price float64

date datetime64[ns]

dtype: object

现在,data变成了一个datetime类型的对象,这对于将来的操作是很有用的。

筛选数据

我认为在Excel中最方便的功能是筛选。我想几乎每一次有人拿到一个任意大小的Excel文件,当他们想要筛选数据的时候,都会使用这个功能。

如图,对本数据集使用该功能:

excel-filter

同Excel中的筛选功能一样,你可以使用pandas来筛选和选择某个特定数据的子集。

比方说,如果我们仅仅想查看一个特定的账号,我们可以简单是在Excel中完成,或是使用pandas完成操作。

下面是Excel的筛选解决方案:

excel-filter2

在pandas中执行相关操作比Excel中更加直观。注意,我将会使用head 函数来显示前面几个结果。这仅仅是为了让本文保持简短。

Python

 

1

df[df["account number"]==307599].head()

你还可以以数值为基准来进行筛选。我就不再举任何Excel的例子了。我相信你能明白。

Python

 

1

df[df["quantity"] > 22].head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
3307599Kassulke, Ondricka and MetzS1-654814121.05863.052014-01-01 15:05:22
14737550Fritsch, Russel and AndersonB1-531022371.561645.882014-01-04 08:57:48
15239344Stokes LLCS1-065323471.512431.342014-01-04 11:34:58

如果我们想要更多复杂的筛选,我们可以可以使用map 来以多重标准进行筛选。在这个例子中,从B1中查找以“sku”中起始的项目。

Python

 

1

df[df["sku"].map(lambda x: x.startswith('B1'))].head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
6218895Kulas IncB1-65551231.1062.202014-01-02 10:57:23
14737550Fritsch, Russel and AndersonB1-531022371.561645.882014-01-04 08:57:48
17239344Stokes LLCB1-508091416.23227.222014-01-04 22:14:32

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

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
14737550Fritsch, Russel and AndersonB1-531022371.561645.882014-01-04 08:57:48
26737550Fritsch, Russel and AndersonB1-536364242.061766.522014-01-08 00:02:11
31714466Trantow-BarrowsB1-330873219.56625.922014-01-09 10:16:32

pandas支持的另外一个很有用的函数是isin。它使得我们可以定义一个列表,里面包含我们所希望查找的值

在这个例子中,我们查找包含两个特定account number值的全部项目。

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
1714466Trantow-BarrowsS2-77896-163.16-63.162014-01-01 10:00:47
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
5714466Trantow-BarrowsS2-778961787.631489.712014-01-02 10:07:15
6218895Kulas IncB1-65551231.1062.202014-01-02 10:57:23
8714466Trantow-BarrowsS1-509612284.091849.982014-01-03 11:29:02

pandas支持的另外一个函数叫做query,它使得我们可以有效的再数据集中选择数据。使用它需要安装numexpr ,所以请确保你在进行下面步骤前已经进行了安装。

如果你想要通过名字来得到一个消费者列表,你可以使用query来完成,和前面展示的python语法类似。

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
6218895Kulas IncB1-65551231.1062.202014-01-02 10:57:23
33218895Kulas IncS1-06532322.3667.082014-01-09 23:58:27
36218895Kulas IncS2-340771673.041168.642014-01-10 12:07:30

这里只是做个简单的示例,query函数能做到的还不止这些。我在此展示这些函数的用法,以便当你有需要的时候,会意识到可以用它。

处理日期

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

Python

 

1

2

df = df.sort('date')

df.head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
1714466Trantow-BarrowsS2-77896-163.16-63.162014-01-01 10:00:47
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
3307599Kassulke, Ondricka and MetzS1-654814121.05863.052014-01-01 15:05:22
4412290Jerde-HilpertS2-34077683.21499.262014-01-01 23:26:55

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

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
1042163416Purdy-KundeB1-388514198.694046.292014-09-05 01:52:32
1043714466Trantow-BarrowsS1-30248137.1637.162014-09-05 06:17:19
1044729833Koepp LtdS1-654814816.04769.922014-09-05 08:54:41
1045729833Koepp LtdS2-11481626.50159.002014-09-05 16:33:15
1046737550Fritsch, Russel and AndersonB1-33364476.44305.762014-09-06 08:59:08

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

 

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
242163416Purdy-KundeS1-302481965.031235.572014-03-01 16:07:40
243527099Sanford and SonsS2-82423376.21228.632014-03-01 17:18:01
244527099Sanford and SonsB1-50809870.78566.242014-03-01 18:53:09
245737550Fritsch, Russel and AndersonB1-508092050.111002.202014-03-01 23:47:17
246688981Keeling LLCB1-86481-197.16-97.162014-03-02 01:46:44

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

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
778737550Fritsch, Russel and AndersonS1-654813570.512467.852014-07-01 00:21:58
779218895Kulas IncS1-30248916.56149.042014-07-01 00:52:38
780163416Purdy-KundeS2-824234468.273003.882014-07-01 08:15:52
781672390Kuhn-GusikowskiB1-042024899.394770.722014-07-01 11:12:13
782642753Pollich LLCS2-23246151.2951.292014-07-02 04:02:39

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

 account numbernameskuquantityunit priceext pricedate
1168307599Kassulke, Ondricka and MetzS2-23246688.90533.402014-10-08 06:19:50
1169424914White-TrantowS2-103422558.541463.502014-10-08 07:31:40
1170163416Purdy-KundeS1-277222234.41757.022014-10-08 09:01:18
1171163416Purdy-KundeB1-33087779.29555.032014-10-08 15:39:13
1172672390Kuhn-GusikowskiB1-388513094.642839.202014-10-09 00:22:33

 

Python

 

1

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

 

 account numbernameskuquantityunit priceext pricedate
1174257198Cronin, Oberbrunner and SpencerS2-340771312.24159.122014-10-10 02:59:06
1175740150Barton LLCS1-654812853.001484.002014-10-10 15:08:53
1176146832Kiehn-SpinkaS1-277221564.39965.852014-10-10 18:24:01
1177257198Cronin, Oberbrunner and SpencerS2-16558335.34106.022014-10-11 01:48:13
1178737550Fritsch, Russel and AndersonB1-536361056.95569.502014-10-11 10:25:53

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

使用set_index 来设置新的索引。

Python

 

1

2

df2 = df.set_index(['date'])

df2.head()

 

 account numbernameskuquantityunit priceext price
date      
2014-01-01 07:21:51740150Barton LLCB1-200003986.693380.91
2014-01-01 10:00:47714466Trantow-BarrowsS2-77896-163.16-63.16
2014-01-01 13:24:58218895Kulas IncB1-699242390.702086.10
2014-01-01 15:05:22307599Kassulke, Ondricka and MetzS1-654814121.05863.05
2014-01-01 23:26:55412290Jerde-HilpertS2-34077683.21499.26

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

Python

 

1

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

 

 account numbernameskuquantityunit priceext price
date      
2014-01-01 07:21:51740150Barton LLCB1-200003986.693380.91
2014-01-01 10:00:47714466Trantow-BarrowsS2-77896-163.16-63.16
2014-01-01 13:24:58218895Kulas IncB1-699242390.702086.10
2014-01-01 15:05:22307599Kassulke, Ondricka and MetzS1-654814121.05863.05
2014-01-01 23:26:55412290Jerde-HilpertS2-34077683.21499.26

再一次的,我们可以使用不同的日期表示方法来避免模棱两可的日期命名惯例。

Python

 

1

df2["2014-Jan-1":"2014-Feb-1"].head()

 

 account numbernameskuquantityunit priceext price
date      
2014-01-01 07:21:51740150Barton LLCB1-200003986.693380.91
2014-01-01 10:00:47714466Trantow-BarrowsS2-77896-163.16-63.16
2014-01-01 13:24:58218895Kulas IncB1-699242390.702086.10
2014-01-01 15:05:22307599Kassulke, Ondricka and MetzS1-654814121.05863.05
2014-01-01 23:26:55412290Jerde-HilpertS2-34077683.21499.26

 

Python

 

1

df2["2014-Jan-1":"2014-Feb-1"].tail()

 

 account numbernameskuquantityunit priceext price
date      
2014-01-31 22:51:18383080Will LLCB1-059144380.173447.31
2014-02-01 09:04:59383080Will LLCB1-20000733.69235.83
2014-02-01 11:51:46412290Jerde-HilpertS1-277221121.12232.32
2014-02-01 17:24:32412290Jerde-HilpertB1-86481335.99107.97
2014-02-01 19:56:48412290Jerde-HilpertB1-200002378.901814.70

 

Python

 

1

df2["2014"].head()

 

 account numbernameskuquantityunit priceext price
date      
2014-01-01 07:21:51740150Barton LLCB1-200003986.693380.91
2014-01-01 10:00:47714466Trantow-BarrowsS2-77896-163.16-63.16
2014-01-01 13:24:58218895Kulas IncB1-699242390.702086.10
2014-01-01 15:05:22307599Kassulke, Ondricka and MetzS1-654814121.05863.05
2014-01-01 23:26:55412290Jerde-HilpertS2-34077683.21499.26

 

Python

 

1

df2["2014-Dec"].head()

 

 account numbernameskuquantityunit priceext price
date      
2014-12-01 20:15:34714466Trantow-BarrowsS1-82801377.97233.91
2014-12-02 20:00:04146832Kiehn-SpinkaS2-232463757.812138.97
2014-12-03 04:43:53218895Kulas IncS2-778963077.442323.20
2014-12-03 06:05:43141962Herman LLCB1-531022026.12522.40
2014-12-03 14:17:34642753Pollich LLCB1-536361971.211352.99

正如你所见到的那样,在进行基于日期的排序或者筛选时,可以有很多选择。

额外的字符串方法

Pandas同样已经支持了矢量字符串方法。

如果我们想识别出sku栏中包含某一特定值的全部值。我们可以使用str.contains。在这个例子中,我们已知sku总是以一种相同的方式表示,所以B1仅会出现在sku的前面。你需要理解你的数据来保证你能够得到你想要的结果。

Python

 

1

df[df['sku'].str.contains('B1')].head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
6218895Kulas IncB1-65551231.1062.202014-01-02 10:57:23
14737550Fritsch, Russel and AndersonB1-531022371.561645.882014-01-04 08:57:48
17239344Stokes LLCB1-508091416.23227.222014-01-04 22:14:32

我们可以把查询连接起来并且使用排序来控制数据的顺序。

Python

 

1

df[(df['sku'].str.contains('B1-531')) &amp; (df['quantity']&gt;40)].sort(columns=['quantity','name'],ascending=[0,1])

 

 account numbernameskuquantityunit priceext pricedate
684642753Pollich LLCB1-531024626.071199.222014-06-08 19:33:33
792688981Keeling LLCB1-531024541.191853.552014-07-04 21:42:22
176383080Will LLCB1-531024589.224014.902014-02-11 04:14:09
1213604255Halvorson, Crona and ChamplinB1-531024155.052257.052014-10-18 19:27:01
1215307599Kassulke, Ondricka and MetzB1-531024193.703841.702014-10-18 23:25:10
1128714466Trantow-BarrowsB1-531024155.682282.882014-09-27 10:42:48
1001424914White-TrantowB1-531024181.253331.252014-08-26 11:44:30

彩蛋任务

在Excel中,我发现我自己经常会尝试从一个冗长的列表中,得到一个包含不重复项的小列表。在Excel中这件事情需要分几步来完成,但是在Pandas中却非常简单。有一种方式是使用Excel中提供的高级筛选工具来完成。

excel-filter3

在pandas中,我们对某列使用这个unique函数来获取这个列表。

Python

 

1

df["name"].unique()

 

Python

 

1

2

3

4

5

6

7

8

array([u'Barton LLC', u'Trantow-Barrows', u'Kulas Inc',

u'Kassulke, Ondricka and Metz', u'Jerde-Hilpert', u'Koepp Ltd',

u'Fritsch, Russel and Anderson', u'Kiehn-Spinka', u'Keeling LLC',

u'Frami, Hills and Schmidt', u'Stokes LLC', u'Kuhn-Gusikowski',

u'Herman LLC', u'White-Trantow', u'Sanford and Sons',

u'Pollich LLC', u'Will LLC', u'Cronin, Oberbrunner and Spencer',

u'Halvorson, Crona and Champlin', u'Purdy-Kunde'], dtype=object)

If we wanted to include the account number, we could use drop_duplicates .

如果我们想要包含账户号,我们可以使用drop_duplicates

Python

 

1

df.drop_duplicates(subset=["account number","name"]).head()

 

 account numbernameskuquantityunit priceext pricedate
0740150Barton LLCB1-200003986.693380.912014-01-01 07:21:51
1714466Trantow-BarrowsS2-77896-163.16-63.162014-01-01 10:00:47
2218895Kulas IncB1-699242390.702086.102014-01-01 13:24:58
3307599Kassulke, Ondricka and MetzS1-654814121.05863.052014-01-01 15:05:22
4412290Jerde-HilpertS2-34077683.21499.262014-01-01 23:26:55

很显然我们放入了的数据超过了我们的需要,得到了一些无用的信息,因此,使用ix 来仅仅选择第一第二列。

Python

 

1

df.drop_duplicates(subset=["account number","name"]).ix[:,[0,1]]

 

 account numbername
0740150Barton LLC
1714466Trantow-Barrows
2218895Kulas Inc
3307599Kassulke, Ondricka and Metz
4412290Jerde-Hilpert
7729833Koepp Ltd
9737550Fritsch, Russel and Anderson
10146832Kiehn-Spinka
11688981Keeling LLC
12786968Frami, Hills and Schmidt
15239344Stokes LLC
16672390Kuhn-Gusikowski
18141962Herman LLC
20424914White-Trantow
21527099Sanford and Sons
30642753Pollich LLC
37383080Will LLC
51257198Cronin, Oberbrunner and Spencer
67604255Halvorson, Crona and Champlin
106163416Purdy-Kunde

我认为这个记住这个单独的命令比记忆Excel的各步操作更容易。

如果你想要查看我的笔记 请随意下载。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python pandas可以通过以下步骤筛选Excel数据: 1. 使用pandas库中的read_excel()函数读取Excel文件,将数据读入到DataFrame中。 2. 使用DataFrame中的loc[]函数或者iloc[]函数,根据条件筛选需要的数据。 3. 将筛选后的数据保存到Excel文件中,可以使用to_excel()函数。 例如,以下代码可以读取Excel文件中的数据,并筛选出“销售额”大于100的数据: ``` import pandas as pd # 读取Excel文件 df = pd.read_excel('data.xlsx') # 筛选销售额大于100的数据 df_filtered = df.loc[df['销售额'] > 100] # 将筛选后的数据保存到Excel文件中 df_filtered.to_excel('filtered_data.xlsx', index=False) ``` 以上代码中,'data.xlsx'是要读取的Excel文件名,'销售额'是Excel文件中的列名,'filtered_data.xlsx'是保存筛选后数据的Excel文件名。 ### 回答2: Python是一种面向对象的动态编程语言,很适合数据分析、数据挖掘和数据科学等领域的应用。Pandas是Python的一个数据分析库,它提供了很多有用的数据结构和函数,使得Python更具备分析和处理数据的能力。 Pandas可以轻松地读取、处理和操作Excel文件,提供各种方法和工具来筛选数据。以下是在Python Pandas筛选Excel数据的基本步骤: 1. 导入Pandas库,可以使用以下代码: ``` import pandas as pd ``` 2. 读取Excel文件,常用的方法是使用read_excel()函数,如下所示: ``` df = pd.read_excel('filename.xlsx') ``` 3. 查看数据,可以使用head()函数查看前几行数据,如下所示: ``` print(df.head()) ``` 4. 根据条件筛选数据,如下面的例子中,我们将从df中筛选出所有'Male'性别的数据: ``` male = df[(df['Gender'] == 'Male')] ``` 5. 可以使用多个条件来筛选数据,如下例子所示,我们将从df中筛选出'Male'性别中'Software Engineer'职位的数据: ``` male_software = df[(df['Gender'] == 'Male') & (df['Job Title'] == 'Software Engineer')] ``` 6. 可以使用类似于SQL的关键字来进行筛选,如下所示: ``` df.query("Gender == 'Male' and `Job Title` == 'Software Engineer'") ``` 7. 根据列的值排序数据,可以使用sort_values()函数,如下所示: ``` df.sort_values('Salary', inplace=True) ``` 8. 保存结果,可以使用to_excel()函数保存结果到Excel文件,如下所示: ``` male_software.to_excel('result.xlsx', index=False) ``` 以上就是在Python Pandas筛选Excel数据的基本步骤。筛选Excel数据是数据分析和科学的重要环节,Pandas使得这个过程更加简单和自动化。 ### 回答3: Pandas是Python编程语言中的数据处理包,它能够很方便地对数据进行筛选和分析。Pandas主要使用的是DataFrame对象完成数据处理,其具有类似于Excel电子表格的形式,数据以行和列的形式组织。DataFrame是Pandas中最重要的数据结构,通常它会使用read_excel()函数将Excel文件转换为DataFrame格式,实现数据的筛选和分析。 通常使用Pandas筛选Excel数据可以分为以下步骤: 1. 导入必要的模块和Excel数据 要使用Pandas进行数据处理,我们需要首先导入Python中相应的模块包,如pandas和numpy等。同时,我们需要将需要筛选Excel数据导入到Python中,并将其转化为DataFrame数据结构,此时使用read_excel()函数是比较方便的。 2. 数据清洗 在导入Excel数据后,我们需要对数据进行整理和清洗,删除缺失值和重复值以保证数据的完整性。 3. 数据筛选 将数据整理好后,可以对DataFrame数据表进行筛选。通常情况下,我们可以使用Pandas的布尔索引功能对数据进行筛选。布尔索引是以布尔运算为条件的索引方式,以创建一个筛选器数组来选择DataFrame对象中的特定行、列等。 4. 数据可视化 最后一个步骤是将筛选出来的数据进行可视化展示,可以使用Python中的matplotlib或seaborn等库进行数据可视化。 总之,Python的PandasExcel数据处理方面具有很大的优势和便利,可以快速地对数据进行筛选、分析和可视化等操作。以上是Pandas筛选Excel数据的一般步骤,具体还需根据实际场景来设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值