是否有一些推荐的方法可以将数据从 R(以 形式data.table)传递到 Python,而无需将数据保存到磁盘?我知道我可以使用来自 R 的 python 模块使用reticulate(我想同样的事情可以在另一侧使用rpy2),但是从我读到的内容来看,这会损害库的整体性能,因此有很大的机会与尝试使用或使用 rpy2运行相比,最好将我的 r 存储到光盘data.table并使用 python 和运行从光盘读取相同的数据。lightgbmlightgbmreticulatedata.table
为什么我不坚持使用 R 或 Python:
我更喜欢使用 r data.table(而不是Pandas)进行数据操作,因为它速度更快,内存效率更高,并且具有许多我喜欢的功能,例如不等连接、滚动连接、笛卡尔连接以及非常简单的融合和铸件。我也喜欢这样,每当我data.table在堆栈溢出中提出相关问题时,我都会很快得到高质量的答案,而Pandas我还没有那么成功。但是,有些任务我更喜欢 Python,例如梯度提升或神经网络。
介绍
我试图找到一种最佳方法,如何找到给定列中最后一个非零值的行,并在该行上返回不同列的值。我想在R data.table中做到这一点,我正在寻找该操作的最大效率。
例
让我们有一个像这样的数据表:
set.seed(123)
DT = data.table(x=rep(c("b","a","c"),each=6),
y=rep(1:6, 3),
z = rbinom(18, 1, 0.3))
Run Code Online (Sandbox Code Playgroud)
这提供给我们以下数据表:
x y z
1: b 1 0
2: b 2 1
3: b 3 0
4: b 4 1
5: b 5 1
6: b 6 0
7: a 1 0
8: a 2 1
9: a 3 0
10: a 4 0
11: a 5 1
12: a 6 0
13: c 1 0
14: c 2 0
15: c 3 0 …Run Code Online (Sandbox Code Playgroud) 我试图从ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt上读取气候站信息.但是,由于第一行未完全填充(缺少最后两个cols)并且第5列包含空格,因此我无法完成阅读:
fread('ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt',sep=)
Run Code Online (Sandbox Code Playgroud)
它返回错误消息:
Expected sep (' ') but new line, EOF (or other non printing character) ends
field 5 when detecting types from point 0: AGE00135039 35.7297 0.6500
50.0 ORAN-HOPITAL MILITAIRE
Run Code Online (Sandbox Code Playgroud)
如何在阅读此txt文件时正确应用fread?谢谢!
data.table在每一行中对值进行排序的方式是什么?我可以轻松地编写一个循环来逐行进行排序,但我认为这不是一种非常聪明的做事方式。
例子:
来个赞吧data.table:
df = data.table(ID = c('a', 'b', 'c', 'd', 'e', 'f'),
v1 = c(1,2,1,3,4,5),
v2 = c(2,3,6,1,0,2),
v3 = c(0,0,1,2,3,5))
Run Code Online (Sandbox Code Playgroud)
我可以使用for loop类似这样的方式对此进行排序:
for (i in 1:nrow(df))
{
df[i, 2:4] = sort(df[i, 2:4], decreasing = T)
}
Run Code Online (Sandbox Code Playgroud)
它给出了预期的结果:
ID v1 v2 v3
1: a 2 1 0
2: b 3 2 0
3: c 6 1 1
4: d 3 2 1
5: e 4 3 0
6: f 5 5 2
Run Code Online (Sandbox Code Playgroud)
但它的做事方式似乎很慢。
我正在尝试使用pyarrow.dataset.write_dataset函数将数据写入 hdfs。但是,如果我写入已存在且包含一些数据的目录,则数据将被覆盖,而不是创建新文件。有没有一种方法可以方便地“附加”到现有的数据集,而不必先读入所有数据?我不需要将数据放在一个文件中,我只是不想删除旧的文件。
我目前所做的和不起作用的:
import pyarrow.dataset as ds
parquet_format = ds.ParquetFileFormat()
write_options = parquet_format.make_write_options(
use_deprecated_int96_timestamps = True,
coerce_timestamps = None,
allow_truncated_timestamps = True)
ds.write_dataset(data = data, base_dir = 'my_path', filesystem = hdfs_filesystem, format = parquet_format, file_options = write_options)
Run Code Online (Sandbox Code Playgroud) 当我编写以下pyspark命令时:
# comment 1
df = df.withColumn('explosion', explode(col('col1'))).filter(col('explosion')['sub_col1'] == 'some_string') \
# comment 2
.withColumn('sub_col2', from_unixtime(col('explosion')['sub_col2'])) \
# comment 3
.withColumn('sub_col3', from_unixtime(col('explosion')['sub_col3']))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
.withColumn('sub_col2', from_unixtime(col('explosion')['sub_col2']))
^
IndentationError: unexpected indent
Run Code Online (Sandbox Code Playgroud)
有没有办法在pyspark的多行命令行之间写注释?
我有一个这样的数据框(受到这个问题的启发,设置略有不同):
df3 = hive_context.createDataFrame([
Row(a=107831, f=3),
Row(a=107531, f=2),
Row(a=125231, f=2)
])
Run Code Online (Sandbox Code Playgroud)
基于此,我创建了两个新对象。每个都是原始数据帧的子集:
from pyspark.sql.functions import col
df1 = (df3
.filter(((col('a') == 107831) & (col('f') == 3))|
((col('a') == 125231) & (col('f') == 2))))
df2 = (df3
.filter(((col('a') == 107831) & (col('f') == 3))|
((col('a') == 107531) & (col('f') == 2))))
Run Code Online (Sandbox Code Playgroud)
然后,我想加入这两个数据集并f从每个数据集获取列,如下所示:
a = (df1
.join(df2, (df1['a'] == df2['a']), how = 'full')
.select(df1['f'], df2['f']).collect())
Run Code Online (Sandbox Code Playgroud)
但是,我得到 [Row(f=None, f=None), Row(f=2, f=2), Row(f=3, f=3)]
而不是所需的[Row(f=3, f=4), Row(f=None, f=2), Row(f=2, …
我想从 a 中有效地按组进行随机样本data.table,但应该可以为每个组抽取不同的比例。
如果我想从每个组中抽取分数,我可以从这个问题和相关sampling_fraction答案中得到启发,做一些类似的事情:
DT = data.table(a = sample(1:2), b = sample(1:1000,20))
group_sampler <- function(data, group_col, sample_fraction){
# this function samples sample_fraction <0,1> from each group in the data.table
# inputs:
# data - data.table
# group_col - column(s) used to group by
# sample_fraction - a value between 0 and 1 indicating what % of each group should be sampled
data[,.SD[sample(.N, ceiling(.N*sample_fraction))],by = eval(group_col)]
}
# what % of data should be …Run Code Online (Sandbox Code Playgroud) data.table ×5
r ×5
python ×3
pyspark ×2
comments ×1
import ×1
oversampling ×1
pyarrow ×1
pyspark-sql ×1