软件应用 | Python+Stata:数据操作对比
来源:Pandas中文网
转载自公众号计量经济学服务中心
本节旨在演示如何在 pandas 中做各种类似Stata的操作。
按照惯例,我们按如下方式导入 pandas 和 NumPy:
import pandas as pd
import numpy as np
在Python教程中,DataFrame将通过调用显示pandas df.head(),它将显示该行的前N行(默认为5行)DataFrame。
这通常用于交互式工作(例如Jupyter笔记本或终端),而Stata中的等价物将是:list in 1/5
1、数据结构
一般术语对照表
DataFrame/ Series pandas 中的 DataFrame 类似于 Stata 数据集-具有不同类型的标记列的二维数据源。如本文所示,几乎任何可以应用于Stata中的数据集的操作也可以在 pandas 中完成。
Series 是表示DataFrame的一列的数据结构。Stata 对于单个列没有单独的数据结构,但是通常,使用 Series 类似于引用Stata中的数据集的列。
Index每个 DataFrame 和 Series 在数据 行 上都有一个叫 Index-label 的标签。在 Stata 中没有相似的概念。
在Stata中,数据集的行基本上是无标签的,除了可以用 _n 访问的隐式整数索引。在pandas中,如果未指定索引,则默认情况下也使用整数索引(第一行= 0,第二行= 1,依此类推)。虽然使用标记Index或 MultiIndex可以启用复杂的分析,并且最终是 pandas 理解的重要部分,但是对于这种比较,我们基本上会忽略它, Index并且只是将其DataFrame视为列的集合。
2、数据输入/输出
从价值观构建数据帧
通过将数据放在input语句之后并指定列名,可以从指定值构建Stata数据集。
input x y
1 2
3 4
5 6
end
pandas 的 DataFrame 可以用许多不同的方式构建,但对于少量的值,通常可以方便地将其指定为Python字典,其中键是列名,值是数据。
3、读取外部数据
与Stata一样,pandas提供了从多种格式读取数据的实用程序。
Stata提供将csv数据读入内存中的数据集。如果文件在当前工作目录中,我们可以按如下方式导入它。import delimited````tips.csv
import delimited tips.csv
pandas 方法是read_csv()类似的。此外,如果提供了网址,它将自动下载数据集。
比如,可以使用许多参数来指定数据应该如何解析。例如,如果数据是由制表符分隔的,没有列名,并且存在于当前工作目录中,则pandas命令将为:import delimitedread_csv()
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 还可以用于 .dta 的文件格式中。使用read_stata()函数读取格式的Stata数据集。
df = pd.read_stata('data.dta')
除了text / csv和Stata文件之外,pandas还支持各种其他数据格式,如Excel,SAS,HDF5,Parquet和SQL数据库。这些都是通过pd.read_* 函数读取的。
4、导出数据
stata 中 import delimated 的反向操作是 export delimated。
export delimited tips2.csv
类似地,在 pandas 中,read_csv 的反向操作是DataFrame.to_csv()
tips.to_csv('tips2.csv')
pandas 还可以使用DataFrame.to_stata()方法导出为Stata文件格式。
tips.to_stata('tips2.dta')
5、数据操作
列上的操作 在Stata中,任意数学表达式可以与新列或现有列上的generate和 replace命令一起使用。该drop命令从数据集中删除列。
replace total_bill = total_bill - 2
generate new_bill = total_bill / 2
drop new_bill
pandas 通过指定个体提供了类似的矢量化操作Series中DataFrame。可以以相同的方式分配新列。该DataFrame.drop()方法从中删除一列DataFrame。
过滤
在Stata中过滤是通过 if 一个或多个列上的子句完成的。
list if total_bill > 10
DataFrame可以通过多种方式进行过滤; 最直观的是使用 布尔索引
tips[tips['total_bill'] > 10].head()
如果/那么逻辑
在Stata中,if子句也可用于创建新列。
generate bucket = "low" if total_bill < 10
replace bucket = "high" if total_bill >= 10
使用 numpy 的 where 方法可以在 pandas 中完成相同的操作。
tips['bucket'] = np.where(tips['total_bill'] < 10, 'low', 'high')
tips.head()
Out:
total_bill tip sex smoker day time size bucket
0 14.99 1.01 Female No Sun Dinner 2 high
1 8.34 1.66 Male No Sun Dinner 3 low
2 19.01 3.50 Male No Sun Dinner 3 high
3 21.68 3.31 Male No Sun Dinner 2 high
4 22.59 3.61 Female No Sun Dinner 4 high
列的选择
Stata 提供了选择,删除和重命名列的关键字。
keep sex total_bill tip
drop sex
rename total_bill total_bill_2
按值排序
Stata中的排序是通过 sort
sort sex total_bill
pandas 对象有一个DataFrame.sort_values()方法,它采用列表进行排序。
tips = tips.sort_values(['sex', 'total_bill'])
tips.head()
total_bill tip sex smoker day time size
67 1.07 1.00 Female Yes Sat Dinner 1
92 3.75 1.00 Female Yes Fri Dinner 2
111 5.25 1.00 Female No Sat Dinner 1
145 6.35 1.50 Female No Thur Lunch 2
135 6.51 1.25 Female No Thur Lunch 2
点击搜索你感兴趣的内容吧
往期推荐
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
欢迎扫描👇二维码添加关注