文件的读写
pandas集成了很多文件格式的读写,R中除了文本格式,其他格式都分散在各种包中,pandas使用体验更好一点。
另外,R的read.csv
读取数据是,默认stringsAsFactors = TRUE
,这个我认为是体验不太好的地方,好在4.0版本开始修改默认为FALSE
。
强烈推荐R中的一个神级包data.table
,对大数据的读写有超高的效率,Python中也实现了类似的包,datatable
。
格式 | Python读 | Python写 | R读 | R写 |
---|---|---|---|---|
CSV | pd.read_csv | pd.to_csv | read.csv data.table::fread |
write.csv data.table::fwrite |
TXT | pd.read_table | pd.to_csv | read.table | write.table |
固定宽度Text | pd.read_fwf | NA | read.fwf | NA |
Excel | pd.read_excel | pd.to_excel | readxl::read_excel | writexl::write_xlsx |
JSON | pd.read_json | pd.to_json | jsonlite::fromJSON | jsonlite::toJSON |
基本数据结构
Series
索引在pandas中是非常重要的概念,但在R中这个概念就很弱,甚至在R的DataFrame中尽量避免使用行名(R的行名相当于pandas中dataframe的索引)。
s = pd.Series(data = [100, 'a', {
'dic1':5}],
index = pd.Index(['id1', 20, 'third'], name='my_idx'),
dtype = 'object',
name = 'my_name')
s.shape
s['third'] ## 返回dict
s[['third']] ## 返回series
# s = pd.Series(np.arange(5), dtype=np.float32)
s <- list(
id1 = 100,
`20` = 'a',
third = list(
dic1 = 5
)
)
length(s)
s[['third']]
s['third']
DataFrame
对DataFrame数据的操作,pandas的[]
和[[]]
操作与R正好相反。
R中$
也可以获取字段数据,但只能获取一列,而且是模糊匹配,[[]]
也可以通过exact = FALSE
实现模糊匹配字段。R的这个特性,我只在明确知道字段名称,而自己当时又特别懒的情况下,临时使用。也许是我没发现这个功能在其他地方有什么神奇效果,但我觉得这个弊大于利。
# Python
df = pd.DataFrame(
data = {
'col_0': [1,2,3],
'col_1':list('abc'),
'col_2': [1.2, 2.2, 3.2],
'mycol': range(3)},
index = ['row_%d'%i for i in range(3)])
df['col_0'] # 返回series
df[['col_0']] # 返回dataframe
df.col_0.values # 返回numpy.ndarray
df.col_0.to_numpy() # 返回numpy.ndarray
# R
df <- data.frame(
col_0 = 1:3,
col_1 = c('a', 'b', 'c'),
col_2 = c(1.2, 2.2, 3.2),
mycol = 0:2,
stringsAsFactors = FALSE
)
df["col_0"] # 返回dataframe
df[["col_0"]] # 返回vector
df$col_0 # 返回vector
df[, "col_0"] # 返回vector
df$my
df[['my', exact = FALSE]]
# R-dplyr
pull(df, col_0)
pull(df, col_0, col_1) ## 可以直接用col_1给col_0命名
常用函数
# Python
df = pd.read_csv('data/learn_pandas.csv')
# R
df <- read.csv('data/learn_pandas.csv', stringsAsFactors = FALSE)
内容 | Python | R |
---|---|---|
行名 | df.index | rownames(df) |
列名 | df.columns | colnames(df) |
字段类型 | df.dtypes | sapply(df, class) |
字段信息 | df.info | str(df) |
主要统计量 | df.describe() | summary(df) |
字段数据 | df[‘School’] | df[[‘School’]] df$School |
维度 | df.ndim | - |
维度 | df.size | prod(dim(df)) |
维度 | df.shape | dim(df) |
行数 | df.shape[0] | nrow(df) |
列数 | df.shape[1] | ncol(df) |
列数 | df.head() | head(df) |
列数 | df.tail() | tail(df) |
特征统计函数
pandas可以直接使用统计函数,对各列进行统计,使用起来非常方便。
R与pandas有所差异,只有几个可以直接实现,但R中有summary
可以直接查看所有列几个常用的统计指标,其他也可以使用apply
系列函数实现。
# Python
df_demo = df[['Height', 'Weight']]
df_demo.sum()
df_demo.mean()
df_demo.max()
# R
df_demo <- df[, c('Height', 'Weight')]
summary(df_demo)
colSums(df_demo, na.rm = TRUE)
colMeans(df_demo, na.rm = TRUE)
sapply(df_demo, max, na.rm = TRUE)
替换函数
pandas的replace功能比R的replace功能更加全面。
# Python
df['Gender'].replace({
'Female':0, 'Male':1}).head()
# R