来源: Comparison with Stata
译者:郭李鹏 (山西晋城市财政局)
Stata 连享会:知乎 | 简书 | 码云 编者按: 不同语言和软件有其独特功能。在研究工作中,我们往往会同时采用多种工具完成我们的研究任务。本文通过实例对比 Python 和 Stata 在语法上的差别,以便于各位能在二者之间自如切换。事实上,两边的用户都在努力促成彼此的融合,介绍 Python 与 Stata 结合的文章如下: - 双剑合璧之Stata与Python:初识IPyStata - 知乎
- Data Workflows in Stata and Python Data Workflows in Stata and Python
- Python - Comparison with Stata — pandas 0.24.2 documentation
- GitHub - jrfiedler/python-in-stata: Use Python within Stata
python 爬虫与文本分析专题-现场班
连享会-Python爬虫与文本分析现场班-山西大学 2019.5.17-19[h2]一起学空间计量……[/h2]
空间计量专题-西安 2019.6.27-30文中包含的链接在微信中无法生效。请点击本文底部左下角的,转入本文。
对于使用 Stata 的用户,本文通过对比演示如何用 pandas 实现 Stata 的基本操作。
如果你对 pandas 还不熟悉,你可以先通读一遍 10 分钟入门 pandas ,熟悉一下相关库。
通常我们按照如下方式导入 pandas 和 numpy 库,在本文后续部分,我们将使用 pd 和 np 分别代表相关库。
- In [1]: import pandas as pd
复制代码
- In [2]: import numpy as np
复制代码 请注意
本文通过调用命令来显示 pandas 数据集的前 N ( 默认 5 ) 行数据。Stata 中对应命令为:
[h1]1. 数据结构[/h1][h2]1.1 常用术语对照[/h2]pandasStataDataFramedata setcolumnvariablerowobservationgroupbybysortNaN.[h2]1.2 DataFrame / Series[/h2]pandas 中的类似于 Stata 数据集——一个二维数据,每列可以是不同的值类型。正如本文将要展示,几乎任何可以对 Stata 的数据集应用的操作都可以在 pandas 中完成。是表示列的数据结构。Stata 没有针对列的单独数据结构,但通常,使用类似于引用 Stata 数据集中的列。
[h2]1.3 Index[/h2]每个和都有一个索引——数据 行 的标签。Stata 没有一个完全类似的概念。在 Stata 中,除了可以用暗含索引访问行外,数据基本没有行标签。
在 pandas 中,即使没有指定索引,也可以使用默认整数索引(第一行= 0,第二行= 1,依次类推)。虽然使用单个索引或多个索引可以进行复杂的分析,并且是的重要功能,但是为了与 Stata 比较,本文中将基本忽略行索引,只将作为列的集合。获取更多有关使用索引的信息,请参阅索引文档。
[h1]2. Data Input / Output[/h1][h2]2.1 创建 DataFrame[/h2]Stata数据通过语句赋值并指定列名。
创建有很多,数据量较小时,最常用的方法是传入一个 Python 字典,其中字典每一个 key 对应一列,与 key 对应 value 是该列下所有数据。
- In [3]: df = pd.DataFrame({'x': [1, 3, 5], 'y': [2, 4, 6]})
复制代码 [h2]2.2 读取外部数据[/h2]与 Stata 一样,pandas 可以从许多格式文件中读取数据。可以通过链接获取 pandas 测试数据集,我们将在下面的许多示例中使用到这份数据。
Stata 通过将 csv 数据文件读入内存中。如果文件在当前工作目录中,我们可以按照以下方式导入。
- import delimited tips.csv
复制代码 pandas 通过方法读取 csv 文件,与 Stata 工作原理类似。此外,pandas 可以通过 url 自动下载数据集。
- In [5]: url = ('https://raw.github.com/pandas-dev'
复制代码- ...: '/pandas/master/pandas/tests/data/tips.csv')
复制代码
- In [6]: tips = pd.read_csv(url)
复制代码
- 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
复制代码 与一样,可以使用更多参数来导入数据。例如,如果数据是用 tab 分隔的,没有列名,并且存在于当前工作目录中, panda 命令将是:
- tips = pd.read_csv('tips.csv', sep='\t', header=None)
复制代码
- # alternatively, read_table is an alias to read_csv with tab delimiter
复制代码- tips = pd.read_table('tips.csv', header=None)
复制代码 pandas 还可以使用函数读取格式的 Stata 数据。
- df = pd.read_stata('data.dta')
复制代码 除了 text/csv 和 Stata 文件之外,pandas 还支持许多种其他数据格式,如 Excel / SAS / HDF 5 / Parquet 和 SQL 数据库。这些都是通过相关命令读取的。有关详细信息,请参阅 IO 文档。
[h2]2.3 导出数据[/h2]在 Stata 中,与功能相反的函数是。
- export delimited tips2.csv
复制代码 类似地,在 pandas 中,功能相反的函数是。
pandas 还可以使用方法导出到 Stata 格式文件。
- tips.to_stata('tips2.dta')
复制代码 [h1]3. 数据操作[/h1][h2]3.1 列操作[/h2]在 Stata 中,可以使用和在数据某一列或新产生一列上运算任意数学公式。
- replace total_bill = total_bill - 2
复制代码- generate new_bill = total_bill / 2
复制代码 pandas 通过在中 x 选定各个来进行类似的向量化操作。可以用同样的方法产生新的列。可以用方法从 DataFrame 中删除列。
- In [8]: tips['total_bill'] = tips['total_bill'] - 2
复制代码
- In [9]: tips['new_bill'] = tips['total_bill'] / 2
复制代码
- total_bill tip sex smoker day time size new_bill
复制代码- 0 14.99 1.01 Female No Sun Dinner 2 7.495
复制代码- 1 8.34 1.66 Male No Sun Dinner 3 4.170
复制代码- 2 19.01 3.50 Male No Sun Dinner 3 9.505
复制代码- 3 21.68 3.31 Male No Sun Dinner 2 10.840
复制代码- 4 22.59 3.61 Female No Sun Dinner 4 11.295
复制代码
- In [11]: tips = tips.drop('new_bill', axis=1)
复制代码 [h2]3.2 条件过滤[/h2]Stata 中使用语句对一个或多个列的数据进行筛选。
DataFrames 有多种过滤方式,最直观的是使用 boolean indexing 。
- In [12]: tips[tips['total_bill'] > 10].head()
复制代码- total_bill tip sex smoker day time size
复制代码- 0 14.99 1.01 Female No Sun Dinner 2
复制代码- 2 19.01 3.50 Male No Sun Dinner 3
复制代码- 3 21.68 3.31 Male No Sun Dinner 2
复制代码- 4 22.59 3.61 Female No Sun Dinner 4
复制代码- 5 23.29 4.71 Male No Sun Dinner 4
复制代码 [h2]3.3 If 条件语句[/h2]在 Stata 中,可以使用 if 语句来创建新列。
- generate bucket = "low" if total_bill = 10
复制代码 在 pandas 中也可以使用的方法来完成相同的操作。
- [code]In [13]: tips['bucket'] = np.where(tips['total_bill']
|
|