小编Joh*_*ler的帖子

以高效的内存方式将大型csv读入稀疏的pandas数据帧

pandas read_csv函数似乎没有稀疏选项.我有csv数据,其中有大量零(它压缩得非常好,并且剥离任何0值都会将其减少到几乎原始大小的一半).

我已经尝试将它加载到密集矩阵中read_csv然后调用to_sparse,但是它需要很长时间并且在文本字段上窒息,尽管大多数数据都是浮点数.如果我pandas.get_dummies(df)先调用将分类列转换为1和0,那么调用to_sparse(fill_value=0)它需要花费大量时间,比我预期的大得多的数字表有更长的时间,大多数为零.即使我从原始文件中删除零并调用to_sparse()(以使填充值为NaN),也会发生这种情况.这也恰好不管我是否通过kind='block'kind='integer'.

除了手工构建稀疏数据帧之外,是否有一种好的,平滑的方式可以直接加载稀疏的csv而不会占用大量不必要的内存?


下面是一些代码,用于创建具有3列浮点数据和一列文本数据的样本数据集.大约85%的浮点值为零,CSV的总大小约为300 MB,但您可能希望将其放大以真正测试内存约束.

np.random.seed(123)
df=pd.DataFrame( np.random.randn(10000000,3) , columns=list('xyz') )
df[ df < 1.0 ] = 0.0
df['txt'] = np.random.choice( list('abcdefghij'), size=len(df) )
df.to_csv('test.csv',index=False)
Run Code Online (Sandbox Code Playgroud)

这是一种简单的阅读方式,但希望有更好,更有效的方法:

sdf = pd.read_csv( 'test.csv', dtype={'txt':'category'} ).to_sparse(fill_value=0.0)
Run Code Online (Sandbox Code Playgroud)

编辑添加(来自JohnE): 如果可能,请在答案中提供有关读取大型CSV的一些相对性能统计数据,包括有关如何测量内存效率的信息(特别是因为内存效率比时钟时间更难测量).特别要注意的是,如果内存效率更高,那么较慢的(时钟时间)答案可能是最佳答案.

python numpy scipy pandas dask

24
推荐指数
2
解决办法
3770
查看次数

制作部分应用的功能列表(优雅或惯用)

我几乎可以通过我的Haskell问题绊倒,但我没有找到更好的解决方案来解决我的问题.

假设我有一个带有f5个参数的函数,我想创建一个部分应用的函数列表,它们应用了前3个参数,但在列表的每个元素中都有所不同.

例如,让我们说,f :: Num a => a -> a -> a -> b -> b -> c我想最终[b -> b -> c]得到结果的类型.其中一个功能可能是f 1 3 5,另一个可能是f 6 4 2.

有一个论点,我可以做一些像

map f [1..4] 
Run Code Online (Sandbox Code Playgroud)

得到f 1,f 2等等,我可以做2个args

map (uncurry f) $ zip [1..3] [6..8].
Run Code Online (Sandbox Code Playgroud)

现在我可以做3个args

map (uncurry $ uncurry f) $ zip (zip [1..3] [6..8]) [3..5]
Run Code Online (Sandbox Code Playgroud)

但是这种速度非常快.是否有更优雅(或惯用)的方式(除了使我自己的"uncurry3"功能配对zip3)?我总是遇到一个优雅的Haskell解决方案,这看起来非常笨拙.

对不起,如果这是一个新手问题或之前已经回答过.谢谢.

haskell currying

7
推荐指数
2
解决办法
274
查看次数

如何在org-mode的beamer导出功能中为列表使用叠加规范?

似乎itemize列表是在org-mode的beamer导出中自动生成的.我可以指定<only@2>类似块之类的东西,但是如果我想将它与项目一起使用,我似乎必须手动写出一个逐项列表.例如,我希望一次输入一个列表项,但我没有,我在一张幻灯片中看到它们:

*** Test
**** one
:PROPERTIES:
:BEAMER_envargs: <only@+>
:END:
**** two
:PROPERTIES:
:BEAMER_envargs: <only@+>
:END:
**** three
:PROPERTIES:
:BEAMER_envargs: <only@+>
:END:
Run Code Online (Sandbox Code Playgroud)

此外,似乎我应该能够做到:

*** Test
:PROPERTIES:
:BEAMER_envargs: [<only@+>]
:END: 
- one
- two
- three
Run Code Online (Sandbox Code Playgroud)

为了同样的效果,但我看到了整个清单.这也不起作用:

*** Test
:PROPERTIES:
:BEAMER_envargs: [<only@+>]
:END:
**** one
**** two
**** three
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

beamer org-mode

4
推荐指数
1
解决办法
1654
查看次数

用于矩形选择的填充区域?

我想做一些像fill-region之类的东西,除了我想选择一个矩形区域并且只包含它里面的文本,并让它保持在矩形边界内.有没有办法做到这一点?

emacs

4
推荐指数
1
解决办法
331
查看次数

标签 统计

beamer ×1

currying ×1

dask ×1

emacs ×1

haskell ×1

numpy ×1

org-mode ×1

pandas ×1

python ×1

scipy ×1