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的一些相对性能统计数据,包括有关如何测量内存效率的信息(特别是因为内存效率比时钟时间更难测量).特别要注意的是,如果内存效率更高,那么较慢的(时钟时间)答案可能是最佳答案.
我几乎可以通过我的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解决方案,这看起来非常笨拙.
对不起,如果这是一个新手问题或之前已经回答过.谢谢.
似乎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)
我在这里错过了什么?
我想做一些像fill-region之类的东西,除了我想选择一个矩形区域并且只包含它里面的文本,并让它保持在矩形边界内.有没有办法做到这一点?