Dormouse Hole

The new hole since 2018

0%

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

首先准备一个函数,用来生成用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c 。

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

茴香豆一: to_numeric()

这个函数可以把 scalar 、 list 、tuple 、 1-d array 或者 Series 类型的数据转换为数字类型的数据。
默认根据输入的参数返回 float64 或者 int64 类型。

把一个序列转换为数字,序列中的数据的数据类型不要求一致。

1
2
3
4
5
6
>>> s = pd.Series(["1", 2, "3"])
>>> pd.to_numeric(s)
0 1
1 2
2 3
dtype: int64

生成一个有三个列的示例 DataFrame

1
2
3
4
5
6
7
8
9
>>> df = pd.DataFrame({
... 'a':['1','2','3'],
... 'b':[4,'5.0',6],
... 'c':['7',8,9]})
>>> df.dtypes
a object
b object
c object
dtype: object

转换所有的列

1
2
3
4
5
>>> df.apply(pd.to_numeric).dtypes
a int64
b float64
c int64
dtype: object
Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。
这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不
敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

1
2
3
SELECT *
FROM table_name
WHERE column_name = value

上面的 SQL 语句可以用来在数据库中根据字段的值选取符合条件的记录,那么在 DataFrame 中如何根据列的值来选取行呢?

本文测试数据来源:https://raw.github.com/pandas-dev/pandas/master/pandas/tests/io/data/csv/tips.csv

1
2
3
4
5
6
7
8
9
10
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.read_csv('tips.csv')
>>> df.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4

茴香豆一: []索引

最直观的方法是通过逻辑条件来筛选行。 在逻辑条件中,等于用 == ,不等于用 != ,还有 ><>=<= 。 多个条件组合的情况下,与用 & , 或用 | ,非用 ~ 。 是否在某个范围内用 isin 。 示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> mask = [False] * 244
>>> mask[1] = True
>>> mask[3] = True
>>> df[mask]
total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2

>>> # 选取性别为男性的行
>>> df[df['sex'] == 'Male'].head()
total_bill tip sex smoker day time size
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
5 25.29 4.71 Male No Sun Dinner 4
6 8.77 2.00 Male No Sun Dinner 2

>>> # 选取小费超过 2 ,或者性别为女性的行
>>> df[(df['tip']>2) | (df['sex']=='Female')].head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
Read more »

关于新手 Python 环境的选择

Linux 操作系统和 MAC 一般是自带 Python 的,可以直接使用 Python 。而 Windows 操作一般是不带 Python 的。所以,在 Windows 中,必须先安装安装 Python 环境才能学习和使用 Python 。针对不同的需求,不同的环境,Python 环境的搭建方式是多种多样。对于新手来说,我觉得 Anaconda 是一个相当好的选择。 Anaconda 是一个 Python 发行套装。现在(2021年2月17日),最新版本的 Anaconda 包含 Python 3.8 和其他丰富的用于科学计算的包(conda, numpy, scipy, ipython notebook等)。 Anaconda 有以下主要特点:

  1. 开源
  2. 安装过程简单
  3. 高性能使用Python和R语言
  4. 免费的社区支持
  5. 支持 Windows 、Linux 和 MAC 。
Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

首先准备一个函数,用来生成用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c 。

1
2
3
4
5
6
7
8
9
>>> import numpy as np
>>> import pandas as pd

>>> df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> df
a b c
0 1 4 7
1 2 5 8
2 3 6 9

BOSS 的要求是把每一行的 a , b 打印出来,例如:

1
2
3
1 4
2 5
3 6

茴香豆一: iterrows

DataFrame 有一个函数,专门就是用来遍历所有的行的:

1
2
3
4
5
>>> for index, row in df.iterrows():
>>> print(row['a'], row['b'])
1 4
2 5
3 6

这个函数简单明了,似乎不错,但是有一个致命的弱点:一般情况下会比较慢,在行数较多的情况下,那个什么,会怀疑人生。

Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

一共有多少条数据?这大概是数据分析工作最基本的内容吧。
这里,我们来聊一聊如何获取 Pandas 中 DataFrame 的行数。
首先准备一个用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c :

1
2
3
4
5
6
7
8
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'a':[None,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> df
a b c
0 NaN 4 7
1 2.0 5 8
2 3.0 6 9

茴香豆一: count

SQL 语句有一个 SELECT count (*) FROM some_table
DataFrame 同样有一个 count 函数可以用来计数,示例如下:

1
2
>>> df['a'].count()
2

等等,怎么会是 2 ?结果应该是三才对啊!原来, count 会把 NaN 剔除, a 列中有 NaN ,所以结果不对,我们看看 b 列就对了:

1
2
>>> df['b'].count()
3

可是,我们不能保证每一次碰到的 b 列都没有空值啊,于是我们自己造一列出来:

1
2
3
4
5
6
7
8
>>> df['aa'] = 1
>>> df
a b c aa
0 NaN 4 7 1
1 2.0 5 8 1
2 3.0 6 9 1
>>> df['aa'].count()
3

好吧,至此,任务勉强完成了,但是……有一点丑陋。

Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

假设有一个列表:source_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] ,要求把这个列表拍扁,变成:[1, 2, 3, 4, 5, 6, 7, 8, 9]

这里我们先做一点准备工作:

1
2
3
4
5
6
import functools
import itertools
import numpy
import operator

source_list = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]

茴香豆一: for for

如果第一次面对这种问题,可能首先想到的就是 for ,基本的思路如下:

1
2
3
4
5
6
>>> flatten_list = []
>>> for sublist in source_list:
>>> for item in sublist:
>>> flatten_list.append(item)
>>> flatten_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]

嗯,工作完成。

当然,如果你熟悉列表的推导的话,上面的一堆可以浓缩成:

1
[item for sublist in source_list for item in sublist]
Read more »

Tips

  • 合并一个EXCEL 文件中的所有SHEET
1
df=pd.concat(pd.read_excel(workbook_url,sheet_name=None),ignore_index=True)
  • 合并一个目录下所有 EXCEL 文件中的所有SHEET
1
2
3
df = pd.concat(
[pd.concat(pd.read_excel(wb, sheet_name=None), ignore_index=True) for wb in wbs],
ignore_index=True)
  • 看列属性
1
df.dtypes
Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

假设有字典 x 和字典 y , BOSS 需要把他们合并,生成一个新的字典 z , x 和 y 保持不变。要实现的效果如下:

1
2
x = {'a': 1, 'b': 2}
y = {'b': 8, 'c': 9}

经过处理后

1
z = {'a': 1, 'b': 8, 'c': 9}

作为一个超级初学者,可能的做法是:

1
2
3
4
5
6
7
8
9
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 8, 'c': 9}
>>> z = {}
>>> for k, v in x.items():
z[k] = v
>>> for k, v in y.items():
z[k] = v
>>> z
{'a': 1, 'b': 8, 'c': 9}

任务完成!
但是,这样的解法显然是不入孔乙己法眼的,于是开始数茴香豆。

Read more »

用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

首先准备一个函数,用来生成用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c 。

1
2
3
4
5
6
7
8
>>> import pandas as pd
>>> def get_df():
>>> return pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> get_df()
a b c
0 1 4 7
1 2 5 8
2 3 6 9

茴香豆一: columns 属性

有一天, BOSS 说要把 DataFrame 的列名都改为大写。于是我简单粗暴地是把一个 List 丢给了 DataFrame 的 columns 属性,任务完成。示例如下:

1
2
3
4
5
6
7
>>> df = get_df()
>>> df.columns=['A','B','C']
>>> df
A B C
0 1 4 7
1 2 5 8
2 3 6 9
Read more »