python对数据集进⾏排序_关于python:在⼤型数据集的
pandas中排序
我希望按给定的列(特别是p值)对数据进⾏排序。但是,问题是我⽆法将整个数据加载到内存中。因此,以下内容不起作⽤,或者只适⽤于⼩数据集。
data = data.sort(columns=["P_VALUE"], ascending=True, axis=0)
有没有⼀种快速的⽅法可以按给定的列对我的数据进⾏排序,该列只考虑数据块,不需要在内存中加载整个数据集?
您的数据存储在哪⾥?有多⼤?什么是记忆限制?
它是⼏个TB⽂件,集上的最⼤可⽤内存约为250Gbs。
你是怎么存储的?假设是hdf?
这是⼀个⽂本⽂件。
请参见/pandas-docs/dev/io.html和/pandas-docs/dev/cookbook.ht
ml hdfstore;hdf5是⼀种⾮常⾼效的格式,⽤于快速和节省空间的存储SND检索。分类是以分块的⽅式进⾏的,但肯定是可能的。
我和⼀些同事也遇到了同样的问题。我们最终做的是在⽂件上进⾏⼀个并⾏处理,将⽂件分割成100万⾏更⼩的⽂件块。然后,根据您的排序⽅式,您可以想出某种⽬录⽅案来"排序"⽂件。如果是事务数据,可以使⽤awk或pandas将每100万⾏块解析为⼀个相对年份的季度⽬录/⽂件,然后对这些聚合⽂件进⾏排序。如果您需要⼀个⽂件中的数据,那么在最后,您可以按顺序将它们重新堆叠在⼀起。祝你好运!
这似乎与使⽤熊猫的"⼤数据"⼯作流程有关。@Jo&227;OAbrantes似乎您正在寻代码解决⽅案。你试过那个线程中发布的解决⽅案了吗?
@我想代码不是针对排序问题的
在过去,我使⽤Linux的两个著名的sort和split实⽤程序对⼤熊猫窒息的⼤⽂件进⾏排序。
我不想贬低这⼀页上的另⼀个答案。但是,由于您的数据是⽂本格式(如注释中所⽰),我认为开始将其转换为其他格式(HDF、SQL等)是⾮常复杂的,因为GNU/Linux实⽤程序在过去30-40年中⼀直⾮常有效地解决了这⼀问题。
假设您的⽂件名为stuff.csv,如下所⽰:
4.9,3.0,1.4,0.6
4.8,2.8,1.3,1.2
然后,以下命令将按第3列对其进⾏排序:
sort --parallel=8 -t . -nrk3 stuff.csv
请注意,这⾥的线程数设置为8。
上⾯的内容适⽤于主内存中的⽂件。当您的⽂件太⼤时,您将⾸先将其拆分为多个部分。所以
split -l 100000 stuff.csv stuff
将⽂件拆分为长度不超过100000⾏的⽂件。
现在,您将对每个⽂件分别进⾏排序,如上所述。最后,您将使⽤mergesort,再次通过(waith for it…)sort:
sort -m sorted_stuff_* > final_sorted_stuff.csv
最后,如果您的⽂件不是csv⽂件(⽐如说它是⼀个tgz⽂件),那么您应该到⼀种将csv版本的⽂件导⼊split的⽅法。
是否还需要指定合并排序在末尾的排序顺序,即sort -nrk3 -m sorted_stuff_* > final_sorted_stuff.csv?如果没有这⼀点,我认为不会默认排序为只根据第⼀列进⾏排序,然后向右排序?
正如我在评论中提到的,这个答案已经提供了⼀个可能的解决⽅案。它基于HDF格式。
关于排序问题,⾄少有三种⽅法可以⽤这种⽅法来解决它。
⾸先,您可以尝试直接使⽤panda,查询hdf存储的数据帧。sort命令排序
第⼆,你可以⽤⼤熊猫⽤的折叠桌。
Francesc Alted在Pytables邮件列表中给出提⽰:
The simplest way is by setting the sortby parameter to true in the
don't have to be afraid of your available memory. You will need the Pro
version for getting this capability.
在⽂档中,它说:
sortby :
If specified, and sortby corresponds to a column with an index, then the copy will be sorted by this index. If you want to ensure a fully sorted order, the index must be a CSI one. A reverse sorted copy can be achieved by specifying a negative value for the step keyword. If sortby is omitted or None, the original table order is used
第三,对于Pytables,您仍然可以使⽤⽅法Table.itersorted()。
来⾃⽂档:
Table.itersorted(sortby, checkCSI=False, start=None, stop=None, step=None)
Iterate table data following the order of the index of sortby column. The sortby column must have associated a full index.
另⼀种⽅法是使⽤中间的数据库。详细的⼯作流程可以在plot.ly上发布的ipython笔记本中看到。
这可以解决排序问题,以及熊猫可能进⾏的其他数据分析。看起来它是由⽤户Chris创建的,所以所有的功劳都归他所有。我在这⾥复制相关部分。介绍
This notebook explores a 3.9Gb CSV file.
This notebook is a primer on out-of-memory data analysis with
pandas: A library with easy-to-use data structures and data analysis tools. Also, interfaces to out-of-memory databases like SQLite.
IPython notebook: An interface for writing and sharing python code, text, and plots.
SQLite: An self-contained, server-less database that's easy to set-up and query from Pandas.
Plotly: A platform for publishing beautiful, interactive graphs from Python to the web.
要求
import pandas as pd
from sqlalchemy import create_engine # database connection
将csv数据导⼊sqlite
Load the CSV, chunk-by-chunk, into a DataFrame
Process the data a bit, strip out uninteresting columns
Append it to the SQLite database
disk_engine = create_engine('sqlite:///311_8M.db') # Initializes database with filename 311_8M.db in current directory
chunksize = 20000
index_start = 1
for df ad_csv('311_100M.csv', chunksize=chunksize, iterator=True, encoding='utf-8'):
# do stuff
df.index += index_start
<_sql('data', disk_engine, if_exists='append')
index_start = df.index[-1] + 1
查询值计数并对结果排序
Housing and Development Dept receives the most complaints
df = pd.read_sql_query('SELECT Agency, COUNT(*) as `num_complaints`'
'FROM data '
'GROUP BY Agency '
'ORDER BY -num_complaints', disk_engine)
限制已排序条⽬的数量
What's the most 10 common complaint in each city?
df = pd.read_sql_query('SELECT City, COUNT(*) as `num_complaints` '
'FROM data '
'GROUP BY `City` '
'ORDER BY -num_complaints '
'LIMIT 10 ', disk_engine)
可能相关和有⽤的链接
PANDAS:内存中排序HDF5⽂件
ptrepack sortby需要"full"索引
import blaze
import pandas as pd
d = blaze.Data('my-large-file.csv')
d.P_VALUE.sort()  # Uses Chunked Pandas
为了更快的处理速度,请先将其加载到Blaze可以控制的数据库中。但是如果这是⼀次性的,并且您有时间,那么发布的代码应该可以做到这⼀点。
如果您的csv⽂件只包含结构化数据,我建议只使⽤linux命令。
假设csv⽂件包含两列:COL_1和P_VALUE:
MAP.PY:
import sys
for line in sys.stdin:
col_1, p_value = line.split(',')
print"%f,%s" % (p_value, col_1)
然后,下⾯的linux命令将⽣成已排序p_值的csv⽂件:
cat input.csv | ./map.py | sort > output.csv
如果您熟悉Hadoop,使⽤上⾯的map.py还可以添加⼀个简单的reduce.py,它将通过Hadoop流媒体系统⽣成已排序的csv⽂件。
这是我的诚实建议。/你可以做三个选择。
我喜欢熊猫,因为它有丰富的医⽣和特点,但我被建议使⽤numpy,因为对于较⼤的数据集来说,它感觉更快。你也可以考虑使⽤其他⼯具来做更简单的⼯作。
在使⽤python3的情况下,可以将⼤数据块分解成集合,并执⾏⼀致的线程处理。我太懒惰了,它看起来不酷,你看熊猫,⿇⽊,坐⽴不安是建⽴在硬件设计的⾓度,使多线程,我相信。
您还可以在正在使⽤的pandas排序函数中使⽤"kind"参数。
哥斯⽐,我的朋友。
我想请你展⽰⼀些关于"感觉更快"的参考资料或例⼦。pandas建在numpy的顶部。它就像⼀个numpy数据分析风格的版本。只需做⼀个df.values就可以得到⼀个numpy.array。另外,DataFrame.sort_values()使⽤numpy.sort()。请参见此处的代码。当然,它可能会增加⼀些开销,并且使⽤numpy(CPU时间,也许不是编程时间)可能会稍快⼀些,在这种情况下,您可以轻松地访问numpy对象。
虽然numpy是⼀个很好的⼯具,可以在ram numpy中处理他与作者当前机器讨论的问题的⼤⼩。(这个记忆限制不在最初的问题中。后来在评论中出现)
感谢您清楚地了解"归档和备份"2基础。谢谢⼤家。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。