从 Python 到 R 的数据帧转换:将 Python 字符串保留为 R 字符而不是 R 因子
Dataframe conversion from Python to R: keep Python string as R chr not R factor
祝大家新年快乐,2017 年编码愉快。
我有一个 Python pandas 数据帧,我需要将其转换为 R 数据帧。
我的 Python pandas 数据框如下所示:
'data.frame': 302 obs. of 19 variables:
$ typ : chr "page" "area" "par" "line" ...
$ id : chr "page_1" "block_1_1" "par_1_1" "line_1_1" ...
$ page : num 1 1 1 1 1 1 1 1 1 1 ...
$ area : num NA 1 1 1 2 2 2 2 3 3 ...
$ par : num NA NA 1 1 NA 2 2 2 NA 3 ...
$ line : num NA NA NA 1 NA NA 2 2 NA NA ...
$ x1 : num 0 0.02 36.91 36.91 0.03 ...
$ y1 : num 0 26.1 4.2 4.2 26.1 ...
$ x2 : num 100 5.95 36.92 36.92 5.97 ...
$ y2 : num 100 26.09 8.29 8.29 44.54 ...
$ length : num 100 5.93 0.02 0.02 5.93 ...
$ heigth : num 100 0.01 4.09 4.09 18.44 ...
$ txt : chr "" "" "" "" ...
$ strong : chr "" "" "" "" ...
$ special : chr "" "" "" "" ...
$ AVGx : num 50 2.98 36.91 36.91 3 ...
$ AVGy : num 50 26.09 6.24 6.24 35.31 ...
$ SC_NR : chr "41151000029" "41151000029" "41151000029" "41151000029" ...
$ DOK_LFNR: chr "640" "640" "640" "640" ...
我正在使用:
pandas2ri.activate()
pandas2ri.py2ri(dataframe)
我得到了以下 R 数据框:
'data.frame': 302 obs. of 19 variables:
$ typ : Factor w/ 5 levels "area","line",..: 3 1 4 2 1 4 2 5 1 4 ...
$ id : Factor w/ 302 levels "block_1_1","block_1_10",..: 77 1 78 28 12 89 39 216 21 100 ...
$ page : num 1 1 1 1 1 1 1 1 1 1 ...
$ area : num NA 1 1 1 2 2 2 2 3 3 ...
$ par : num NA NA 1 1 NA 2 2 2 NA 3 ...
$ line : num NA NA NA 1 NA NA 2 2 NA NA ...
$ x1 : num 0 0.02 36.91 36.91 0.03 ...
$ y1 : num 0 26.1 4.2 4.2 26.1 ...
$ x2 : num 100 5.95 36.92 36.92 5.97 ...
$ y2 : num 100 26.09 8.29 8.29 44.54 ...
$ length : num 100 5.93 0.02 0.02 5.93 ...
$ heigth : num 100 0.01 4.09 4.09 18.44 ...
$ txt : Factor w/ 189 levels "","[e]","{minutes}",..: 1 1 1 1 1 1 1 107 1 1 ...
$ strong : Factor w/ 3 levels "","0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ special : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
$ AVGx : num 50 2.98 36.91 36.91 3 ...
$ AVGy : num 50 26.09 6.24 6.24 35.31 ...
$ SC_NR : Factor w/ 1 level "41151000029": 1 1 1 1 1 1 1 1 1 1 ...
$ DOK_LFNR: Factor w/ 1 level "640": 1 1 1 1 1 1 1 1 1 1 ...
问题在于 R 数据帧具有 factor 类型而不是 chr 类型。我设法用 R 代码修复它:
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
有没有办法在转换过程中直接做到这一点?
我正在使用:
python 2.7.12
rpy2 2.8.2
pandas 0.18.1
谢谢
法比恩
我尝试 google 了一点,但我似乎无法找到 pandas2ri.py2ri(dataframe)
函数的良好文档。
R
data.frame
函数(以及 as.data.frame
函数)具有布尔值 stringsAsFactors
参数,文档中的参数是
logical: should character vectors be converted to factors? The ‘factory-fresh’ default is TRUE, but this can be changed by setting options(stringsAsFactors = FALSE).
我想 pandas2ri.py2ri(dataframe)
函数以某种方式支持这个,以及所有其他可选参数。
以下链接将为您提供 R
函数的完整文档:
很抱歉,我无法为您提供更多帮助,但我不懂 Python 语言,也不懂 pandas 程序包;(
考虑通过导入 R 的基础包将 Python 中的字符列转换为字符列。显然,pandas2ri.py2ri()
方法仅使用 R 的 data.frame()
的默认功能,该功能将字符呈现为因子。下面使用 rclass
方法,如 rpy2 docs:
中所述
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importr
base = importr('base')
pandas2ri.activate()
...
# CONVERT PANDAS DF TO R DF
rdf = pandas2ri.py2ri(pydf)
# FIND COLUMN INDEX OF EACH FACTOR IN DF
factors = [i for i,col in enumerate(rdf) if col.rclass[0] == 'factor']
# CONVERT COLS ITERATIVELY
for f in factors:
rdf[f] = base.as_character(rdf[f])
祝大家新年快乐,2017 年编码愉快。
我有一个 Python pandas 数据帧,我需要将其转换为 R 数据帧。 我的 Python pandas 数据框如下所示:
'data.frame': 302 obs. of 19 variables:
$ typ : chr "page" "area" "par" "line" ...
$ id : chr "page_1" "block_1_1" "par_1_1" "line_1_1" ...
$ page : num 1 1 1 1 1 1 1 1 1 1 ...
$ area : num NA 1 1 1 2 2 2 2 3 3 ...
$ par : num NA NA 1 1 NA 2 2 2 NA 3 ...
$ line : num NA NA NA 1 NA NA 2 2 NA NA ...
$ x1 : num 0 0.02 36.91 36.91 0.03 ...
$ y1 : num 0 26.1 4.2 4.2 26.1 ...
$ x2 : num 100 5.95 36.92 36.92 5.97 ...
$ y2 : num 100 26.09 8.29 8.29 44.54 ...
$ length : num 100 5.93 0.02 0.02 5.93 ...
$ heigth : num 100 0.01 4.09 4.09 18.44 ...
$ txt : chr "" "" "" "" ...
$ strong : chr "" "" "" "" ...
$ special : chr "" "" "" "" ...
$ AVGx : num 50 2.98 36.91 36.91 3 ...
$ AVGy : num 50 26.09 6.24 6.24 35.31 ...
$ SC_NR : chr "41151000029" "41151000029" "41151000029" "41151000029" ...
$ DOK_LFNR: chr "640" "640" "640" "640" ...
我正在使用:
pandas2ri.activate()
pandas2ri.py2ri(dataframe)
我得到了以下 R 数据框:
'data.frame': 302 obs. of 19 variables:
$ typ : Factor w/ 5 levels "area","line",..: 3 1 4 2 1 4 2 5 1 4 ...
$ id : Factor w/ 302 levels "block_1_1","block_1_10",..: 77 1 78 28 12 89 39 216 21 100 ...
$ page : num 1 1 1 1 1 1 1 1 1 1 ...
$ area : num NA 1 1 1 2 2 2 2 3 3 ...
$ par : num NA NA 1 1 NA 2 2 2 NA 3 ...
$ line : num NA NA NA 1 NA NA 2 2 NA NA ...
$ x1 : num 0 0.02 36.91 36.91 0.03 ...
$ y1 : num 0 26.1 4.2 4.2 26.1 ...
$ x2 : num 100 5.95 36.92 36.92 5.97 ...
$ y2 : num 100 26.09 8.29 8.29 44.54 ...
$ length : num 100 5.93 0.02 0.02 5.93 ...
$ heigth : num 100 0.01 4.09 4.09 18.44 ...
$ txt : Factor w/ 189 levels "","[e]","{minutes}",..: 1 1 1 1 1 1 1 107 1 1 ...
$ strong : Factor w/ 3 levels "","0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ special : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
$ AVGx : num 50 2.98 36.91 36.91 3 ...
$ AVGy : num 50 26.09 6.24 6.24 35.31 ...
$ SC_NR : Factor w/ 1 level "41151000029": 1 1 1 1 1 1 1 1 1 1 ...
$ DOK_LFNR: Factor w/ 1 level "640": 1 1 1 1 1 1 1 1 1 1 ...
问题在于 R 数据帧具有 factor 类型而不是 chr 类型。我设法用 R 代码修复它:
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
有没有办法在转换过程中直接做到这一点?
我正在使用:
python 2.7.12
rpy2 2.8.2
pandas 0.18.1
谢谢 法比恩
我尝试 google 了一点,但我似乎无法找到 pandas2ri.py2ri(dataframe)
函数的良好文档。
R
data.frame
函数(以及 as.data.frame
函数)具有布尔值 stringsAsFactors
参数,文档中的参数是
logical: should character vectors be converted to factors? The ‘factory-fresh’ default is TRUE, but this can be changed by setting options(stringsAsFactors = FALSE).
我想 pandas2ri.py2ri(dataframe)
函数以某种方式支持这个,以及所有其他可选参数。
以下链接将为您提供 R
函数的完整文档:
很抱歉,我无法为您提供更多帮助,但我不懂 Python 语言,也不懂 pandas 程序包;(
考虑通过导入 R 的基础包将 Python 中的字符列转换为字符列。显然,pandas2ri.py2ri()
方法仅使用 R 的 data.frame()
的默认功能,该功能将字符呈现为因子。下面使用 rclass
方法,如 rpy2 docs:
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importr
base = importr('base')
pandas2ri.activate()
...
# CONVERT PANDAS DF TO R DF
rdf = pandas2ri.py2ri(pydf)
# FIND COLUMN INDEX OF EACH FACTOR IN DF
factors = [i for i,col in enumerate(rdf) if col.rclass[0] == 'factor']
# CONVERT COLS ITERATIVELY
for f in factors:
rdf[f] = base.as_character(rdf[f])