有没有办法配置 ipython notebook,这样每当我打印一个长列表时,我会自动看到底部?
例如,在终端中,如果我运行以下命令:
for i in range(1000):
print i
Run Code Online (Sandbox Code Playgroud)
它会自动滚动到底部:
992
993
994
995
996
997
998
999
In [2]:
Run Code Online (Sandbox Code Playgroud)
但是在 Python 笔记本中,我看到了开头,我必须手动向下滚动到最后一个数字。
我正在运行一个长循环,每次迭代需要几秒钟,每当我想检查程序有多远时,都不得不向下滚动,这很不方便,
谢谢你,
我正在尝试将我的数据帧的一列转换为datetime.在这里讨论之后https://github.com/dask/dask/issues/863我尝试了以下代码:
import dask.dataframe as dd
df['time'].map_partitions(pd.to_datetime, columns='time').compute()
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息
ValueError: Metadata inference failed, please provide `meta` keyword
Run Code Online (Sandbox Code Playgroud)
究竟应该把什么放在元下?我应该在df中或仅在'time'列中放置所有列的字典吗?我应该放什么类型的?我尝试过dtype和datetime64,但到目前为止它们都没有.
谢谢你,我感谢你的指导,
更新
我将在这里包含新的错误消息:
1)使用时间戳
df['trd_exctn_dt'].map_partitions(pd.Timestamp).compute()
TypeError: Cannot convert input to Timestamp
Run Code Online (Sandbox Code Playgroud)
2)使用datetime和meta
meta = ('time', pd.Timestamp)
df['time'].map_partitions(pd.to_datetime,meta=meta).compute()
TypeError: to_datetime() got an unexpected keyword argument 'meta'
Run Code Online (Sandbox Code Playgroud)
3)只使用日期时间:陷入2%
In [14]: df['trd_exctn_dt'].map_partitions(pd.to_datetime).compute()
[ ] | 2% Completed | 2min 20.3s
Run Code Online (Sandbox Code Playgroud)
此外,我希望能够在日期中指定格式,就像我在pandas中所做的那样:
pd.to_datetime(df['time'], format = '%m%d%Y'
Run Code Online (Sandbox Code Playgroud)
更新2
更新到Dask 0.11后,我不再遇到meta关键字问题.不过,我无法在2GB数据帧上超过2%.
df['trd_exctn_dt'].map_partitions(pd.to_datetime, meta=meta).compute()
[ ] | 2% Completed | 30min 45.7s
Run Code Online (Sandbox Code Playgroud)
更新3
这样做得更好:
def parse_dates(df):
return pd.to_datetime(df['time'], …Run Code Online (Sandbox Code Playgroud) 按照这里的示例:https://www.youtube.com/watch?v = jrc3cpf3PKU我尝试将~70GB Dask数据帧与我加载为Pandas数据帧的~24MB进行合并.
合并在两列A和B上,我没有设置任何索引:
import dask.dataframe as dd
from dask.diagnostics import ProgressBar
small_df = pd.read_csv(dataframe1) # as pandas
large_df = dd.read_csv(dataframe2) #as dask.dataframe
df2 = large_df.merge(small_df, how='left', left_on=leftcolumns, right_on=rightcolumns) #do the merge
A = df2[df2['some column'] == 'somevalue'] #do a reduction that would fit on my computer
pbar = ProgressBar()
pbar.register()
result = A.compute()
Run Code Online (Sandbox Code Playgroud)
我使用的是具有16GB RAM和4个内核的Windows计算机.我使用进度条来评估合并过程的进度.我昨晚彻夜离开了.我今天早上重新启动它,到目前为止大约半小时进度和0%进度.
谢谢你,我感谢你的帮助,
更新
我在我的Mac上用8GB内存试过它,效果很好.我相信,我有Anaconda附带的Dask发行版.在任何情况下,我认为我没有做任何不同的事情.
我按照上述编码(21分钟)分享我的结果和时间:
In [26]: C = result1.compute()
[########################################] | 100% Completed | 21min 13.4s
[########################################] | 100% …Run Code Online (Sandbox Code Playgroud) 我认为我已经对这些评论获得了很好的回答,但是我将重新表述该问题以供将来参考。
我正在尝试使用data.table进行分组汇总。问题在于某些组仅具有NA。对于这些组,我希望总和返回NA。但是,如果存在一组值与NA不同的组,我希望获得非NA值的总和。
A <- data.table(col1= c('A','A','B','B','C','C'),
col2= c(NA,NA,2,3,NA,4))
Run Code Online (Sandbox Code Playgroud)
这不添加参数na.rm = T,C组应返回4时返回NA。
A[, sum(col2), by = .(col1)]
col1 V1
1: A NA
2: B 5
3: C NA
Run Code Online (Sandbox Code Playgroud)
但是,na.rm = T在A组应返回NA时,相加将返回0。
A[, sum(col2, na.rm = T), by = .(col1)]
col1 V1
1: A 0
2: B 5
3: C 4
Run Code Online (Sandbox Code Playgroud)
我最喜欢的方法是Sandipan在评论中建议的方法,类似于我在下面编写的功能:
ifelse(all(is.na(col2)), NA, sum(col2, na.rm = T)
Run Code Online (Sandbox Code Playgroud)
我创建了一个函数来解决它,但是我不确定是否有内置的方法来解决这个问题:
sum.na <- function(df){
if (all(is.na(df))){
suma <- NA
}
else {
suma <- sum(df, na.rm = T) …Run Code Online (Sandbox Code Playgroud) 我知道 skiprows 允许您传递包含要跳过的行索引的列表。但是,我有要保留的行的索引。
假设我的 cvs 文件在数百万行中看起来像这样:
A B
0 1 2
1 3 4
2 5 6
3 7 8
4 9 0
Run Code Online (Sandbox Code Playgroud)
我想加载的索引列表只有 2,3,所以
index_list = [2,3]
Run Code Online (Sandbox Code Playgroud)
skiprows 函数的输入是 [0,1,4]。但是,我只有 [2,3] 可用。
我正在尝试类似的东西:
pd.read_csv(path, skiprows = ~index_list)
Run Code Online (Sandbox Code Playgroud)
但没有运气..有什么建议吗?
谢谢,我感谢所有的帮助,
我有两个数据帧,如下所示:
A = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["06/22/2014","07/02/2014","01/01/2015","01/01/1991","08/02/1999"]})
B = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["02/15/2015","06/30/2014","07/02/1999","10/05/1990","06/24/2014"], "value": ["3","5","1","7","8"] })
Run Code Online (Sandbox Code Playgroud)
如下图所示:
>>> A
ID date
0 A 2014-06-22
1 A 2014-07-02
2 C 2015-01-01
3 B 1991-01-01
4 B 1999-08-02
>>> B
ID date value
0 A 2015-02-15 3
1 A 2014-06-30 5
2 C 1999-07-02 1
3 B 1990-10-05 7
4 B 2014-06-24 8
Run Code Online (Sandbox Code Playgroud)
我想使用最近的日期将A与B的值合并。在此示例中,没有日期匹配,但某些日期可能匹配。
输出应该是这样的:
>>> C
ID date value
0 A 06/22/2014 8
1 A 07/02/2014 5 …Run Code Online (Sandbox Code Playgroud) 在 Groupby 文档中,我只看到了按应用于轴 0 索引或列标签的函数进行分组的示例。我没有看到讨论如何通过将函数应用于列而派生的标签进行分组的示例。我认为这将使用apply. 下面的例子是最好的方法吗?
df = pd.DataFrame({'name' : np.random.choice(['a','b','c','d','e'], 20),
'num1': np.random.randint(low = 30, high=100, size=20),
'num2': np.random.randint(low = -3, high=9, size=20)})
df.head()
name num1 num2
0 d 34 7
1 b 49 6
2 a 51 -1
3 d 79 8
4 e 72 5
def num1_greater_than_60(number_num1):
if number_num1 >= 60:
return 'greater'
else:
return 'less'
df.groupby(df['num1'].apply(num1_greater_than_60))
Run Code Online (Sandbox Code Playgroud) 我希望使用包data.table和参数roll ='nearest'在'date'列上找到最接近的匹配项。我首先在另一列(字母)上进行匹配:
set.seed(1)
A <- data.table( dates.A = seq.Date(as.Date('2008-01-01'),as.Date('2008-01-31'), by = '3 days'),
letters.A = LETTERS[1:4] , value.A = runif(4) )
B <- data.table( date.B = seq.Date(as.Date('2008-01-01'),as.Date('2008-01-05'), by = 'days'),
letters.B = LETTERS[1:4] , value.B = runif(4) )
#### Define the columns I merge on
A[, ':=' (dates.merge = dates.A, letters.merge = letters.A)]
B[, ':=' (dates.merge = date.B, letters.merge = letters.B)]
setkeyv(A, c('letters.merge','dates.merge'))
setkeyv(B, c('letters.merge','dates.merge'))
result <- B[A, roll = 'nearest']
#### As a side note, how do I avoid …Run Code Online (Sandbox Code Playgroud) 如何避免R在for循环中将日期转换为数字?这与此问题有关,该问题显示了 mapply禁用 mapply 自动将日期转换为数字的相同行为
date <- c('2008-02-20','2009-10-05')
date <- as.Date(date, format = '%Y-%m-%d')
date
[1] "2008-02-20" "2009-10-05"
for (i in date) print(i)
[1] 13929
[1] 14522
Run Code Online (Sandbox Code Playgroud)
我重新打开了这个问题,因为重复循环在日期时间对象上导致数字迭代器询问为什么R 循环将日期和日期时间对象转换为数字,这个问题询问如何避免这种行为。答案是解决问题的关键,与副本中的已接受答案和其他答案不同,它们正确地回答了其他问题。
这可能是一个基本问题,我一直在努力在Rcpp中传递用户创建的c ++函数.我阅读了文档,似乎我应该使用XPtr提供的SEXP包装(链接:http://gallery.rcpp.org/articles/passing-cpp-function-pointers/ )但是,它仍然不太清楚我该如何正确地做到这一点.在下文中,我想使用函数funcPtrG作为testfun中的参数,即C++方式.我得到如下错误:
#include <RcppArmadillo.h>
typedef double (*funcPtrG)(double theta, double gamma);
using namespace Rcpp;
// [[Rcpp::export]]
double GGfuncpp(double theta, double gamma){
double new_gamma = 0;
new_gamma = theta*gamma + R::rnorm(0,1)*0.0001;
return new_gamma;
}
// [[Rcpp::export]]
double testfun(funcPtrG fun2, double theta, double gamma){
double x= 0;
x = fun2(theta,gamma);
return x;
}
Error: cannot convert 'SEXP' to 'double (*)(double, double)' in initialization
Run Code Online (Sandbox Code Playgroud)
我尝试过x = XPtr<funcPtr>fun2(theta,gamma)但没有给出理想的结果.