在学习大熊猫的过程中,我试图解决这个问题的答案已有好几个月了.我使用SAS进行日常工作,这非常适合它的核心支持.然而,由于其他许多原因,SAS作为一款软件非常糟糕.
有一天,我希望用python和pandas替换我对SAS的使用,但我目前缺乏大型数据集的核心工作流程.我不是在谈论需要分布式网络的"大数据",而是说文件太大而无法容纳在内存中,但又足够小以适应硬盘驱动器.
我的第一个想法是用于HDFStore在磁盘上保存大型数据集,并仅将我需要的部分拉入数据帧进行分析.其他人提到MongoDB是一种更容易使用的替代品.我的问题是:
有哪些最佳实践工作流程可用于完成以下任务:
真实世界的例子将非常受欢迎,尤其是那些在"大数据"上使用熊猫的人.
编辑 - 我希望如何工作的示例:
我正在尝试找到执行这些步骤的最佳实践方法.阅读关于pandas和pytables的链接似乎附加一个新列可能是个问题.
编辑 - 特别回应杰夫的问题:
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'.这些操作的结果是我的数据集中每条记录的新列.我很少会在数据集中添加行.我几乎总是会创建新的列(统计/机器学习用语中的变量或特征).
我正在探索作为长期SAS用户切换到python和pandas.
但是,今天运行一些测试时,我很惊讶python在尝试pandas.read_csv()128mb csv文件时内存不足.它有大约200,000行和200列主要是数字数据.
使用SAS,我可以将csv文件导入SAS数据集,它可以和我的硬盘一样大.
有类似的东西pandas吗?
我经常处理大型文件,无法访问分布式计算网络.
如何从pandas HDFStore中检索特定列?我经常处理非常大的数据集,这些数据集太大而无法在内存中操作.我想迭代地读取一个csv文件,将每个块附加到HDFStore对象中,然后处理数据的子集.我已经阅读了一个简单的csv文件,并使用以下代码将其加载到HDFStore中:
tmp = pd.HDFStore('test.h5')
chunker = pd.read_csv('cars.csv', iterator=True, chunksize=10, names=['make','model','drop'])
tmp.append('df', pd.concat([chunk for chunk in chunker], ignore_index=True))
Run Code Online (Sandbox Code Playgroud)
并输出:
In [97]: tmp
Out[97]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df frame_table (typ->appendable,nrows->1930,indexers->[index])
Run Code Online (Sandbox Code Playgroud)
我的问题是如何从中访问特定列tmp['df']?该文档提到了一种select()方法和一些Term对象.提供的示例适用于小组数据; 然而,我太过新手,无法将其扩展到更简单的数据框案例.我的猜测是我必须以某种方式创建列的索引.谢谢!
关于熊猫数据框的基本问题.我有一个带数据点的1x1数据帧,并且没有列标题(当前). df[0,0]不起作用,因为我认为它期待列名.另外,df.0不工作也不df[0,'']. df.ix[0,0]确实有效.
一般来说,我是否需要有一个列名?将列名与pandas数据帧一起使用是最佳做法吗?如果我的sql查询没有列标题,那么最好在那时添加它们吗?
谢谢您的帮助.
R和Rust都可以与C代码接口,所以我认为这很有可能.但是,我对如何继续有点不清楚.
我已阅读这些部分寻找答案:
但是,虽然我精通,R但我不是一个系统程序员,并且对构建链看起来像这样的努力感到困惑.
使用Rinternals.h将是理想的,但我也会满足于更简单的.C界面.
我有一个名为的泛型函数foo.它在类上的操作方式不同bar,baz但有一些共享预处理只需要执行一次.什么是惯用的R方式来实现这一目标?
在我下面的愚蠢示例中,我希望将传递给对象的对象乘以10.然而,当调用该方法时,原始值将打印到控制台.我已阅读语言定义并知道以下模式不起作用.我的问题是:在调用方法之前,我应该在何处或如何处理泛型参数的共享处理?
a <- structure(1:5, class="bar")
b <- structure(6:10, class="baz")
foo <- function(x) {
x <- x * 10 # where should shared preprocessing go?
UseMethod("foo")
}
foo.bar <- function(x) {
cat("Foo!", x)
}
foo.baz <- function(x) {
cat("Baz!", x)
}
# does not propagate the operations carried out `foo`
foo(a)
foo(b)
Run Code Online (Sandbox Code Playgroud) 我正在创建一个Shiny应用程序,它在屏幕顶部显示data.frame信息,在底部显示特定的变量统计信息.用户可以通过与DT::datatable对象交互来导航data.frame列.
当用户点击变量时,会显示可以编辑的详细信息.我希望这些信息能够更新并反映在数据表中.我的问题是,当我更新表时,它会从一开始就呈现并显示.如何在编辑后保留数据表的页面和行选择?
这是一个最小的工作示例,显示了a中的mtcars数据集DT::datatable.我有一些控制更新字段.请注意,数据表重新渲染回第一页.
library(shiny)
runApp(shinyApp(
ui = fluidPage(
title = "minimal-working-example",
fluidRow(
column(3, inputPanel(
selectInput("field", "Field", choices = names(mtcars)),
numericInput("value", "Value", 0),
actionButton("submit", "Submit")
)),
column(9,
DT::dataTableOutput("table")
)
)
),
server = function(input, output) {
v <- reactiveValues(mtcars=mtcars)
observeEvent(input$submit, {
v$mtcars[input$field] <- input$value
})
output$table <- DT::renderDataTable({
DT::datatable(
v$mtcars,
selection = "single",
options = list(pageLength = 5))
})
}
))
Run Code Online (Sandbox Code Playgroud)
会话信息:
Session info --------------------------
setting value
version R version 3.3.0 (2016-05-03)
system x86_64, mingw32
ui …Run Code Online (Sandbox Code Playgroud) 如何使用pd.read_csv()迭代地浏览文件并保留dtype和其他元信息,就好像我一次读入整个数据集一样?
我需要读入一个太大而无法放入内存的数据集.我想使用pd.read_csv导入文件,然后立即将块附加到HDFStore中.但是,数据类型推断对后续块没有任何了解.
如果存储在表中的第一个块仅包含int,并且后续块包含float,则会引发异常.所以我需要首先使用read_csv遍历数据帧并保留最高的推断类型.另外,对于对象类型,我需要保留最大长度,因为它们将作为字符串存储在表中.
是否存在仅在不读取整个数据集的情况下仅保留此信息的Pandonic方式?
我正在使用Rstudio与Rcpp构建一个包.一切都工作正常,直到我将文档的标记添加到我的函数文件.我希望我忽略了一些明显的东西.
这是我的R函数文件:
#' @useDynLib tablr
#' @importFrom Rcpp sourceCpp
#'
#' fast.table
#'
#' C++ implementation of the R table function. Only supports numeric
#' vectors. Does not currently handle NAs.
#'
#' @param x1 Variable 1
#' @param x2 Variable 2
#' @return A table object equal in every way to an R table object with the same
#' inputs
#'
#' @export fast.table
fast.table <- function(x1, x2) {
nms <- c(deparse(substitute(x1)), deparse(substitute(x2)))
cpp_table(as.numeric(x1), as.numeric(x2), as.character(nms))
}
Run Code Online (Sandbox Code Playgroud)
运行后,devtools::document() …
在这里跟进这个问题,我在使用dyn.load加载链接到Rust dylib的共享库时遇到问题.我怀疑它与R在哪里寻找Rust dylib有关,但我没有找到一种方法来指定另一个位置而不是默认值.
从R开始,我执行以下操作:
> dyn.load('src/test.so')
Run Code Online (Sandbox Code Playgroud)
并收到此错误消息:
Error in dyn.load("src/test.so") :
unable to load shared object '/Users/Zelazny7/r-dev/rustr/src/test.so':
dlopen(/Users/Zelazny7/r-dev/rustr/src/test.so, 6): Library not loaded: libglue.dylib
Referenced from: /Users/Zelazny7/r-dev/rustr/src/test.so
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
如何加载依赖于另一个共享库的共享库?
该文件对于dyn.load没有规定如何做到这一点.
更新:
感谢shepmaster,我能够在R中成功构建和导入共享库.共享库是用C编译的,并且本身链接到Rust库.这些是我的步骤:
我的目录内容:
C:\Users\gravesee\test>ls
rglue.dll rglue.rs rustr.c treble.h
Run Code Online (Sandbox Code Playgroud)
编译最终的共享库:
gcc -shared -m64 -I"C:\Program Files\R\R-3.2.0\include" rustr.c -L"C:\Program Files\R\R-3.2.0\bin\x64" -lR -L. -lrglue -o test.dll
Run Code Online (Sandbox Code Playgroud)
在R中加载库:
> dyn.load("test.dll")
> is.loaded("triple")
[1] TRUE
> .Call("triple", as.integer(32))
The triple is 96
Run Code Online (Sandbox Code Playgroud)