來源: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
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視為列的集合。
通過將數據放在input
語句之后并指定列名,可以從指定值構建Stata數據集。
# 計量經濟學服務中心
input x y
1 2
3 4
5 6
end
pandas 的 DataFrame
可以用許多不同的方式構建,但對于少量的值,通常可以方便地將其指定為Python字典,其中鍵是列名,值是數據。
與Stata一樣,pandas提供了從多種格式讀取數據的實用程序。
Stata提供將csv數據讀入內存中的數據集。如果文件在當前工作目錄中,我們可以按如下方式導入它。import delimited````tips.csv
import delimited tips.csv
pandas 方法是read_csv()
類似的。此外,如果提供了網址,它將自動下載數據集。
比如,可以使用許多參數來指定數據應該如何解析。例如,如果數據是由制表符分隔的,沒有列名,并且存在于當前工作目錄中,則pandas命令將為:import delimited
read_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_*
函數讀取的。
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