首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用熊猫有效地计算大型数据仓库的每个时间仓的值

使用熊猫有效地计算大型数据仓库的每个时间仓的值
EN

Stack Overflow用户
提问于 2020-02-29 07:12:49
回答 2查看 190关注 0票数 0

我有多个大型数据文件(约3GB的csv文件,每行约1.5亿行),其中包含Unix样式的时间戳和随机生成的观察ids。每个观察可以/将在不同的时间发生多次。它们看起来是这样的:

代码语言:javascript
复制
    time_utc    obs_id
0   1564617600  aabthssv
1   1564617601  vvvx7ths
2   1564618501  optnhfsa
3   1564619678  aabthssv
4   1564619998  abtzsnwe
         ...

为了分析观测的时间发展,我现在想要得到一个数据框架,其中包含每个观察id的列,以及一个可以更改的时间桶的行,例如1小时,如下所示:

代码语言:javascript
复制
time_bin aabthssv vvvx7ths optnhfsa  ...
1               1        1        1
2               1        0        0
               ...

为此,我尝试创建一个时间戳起始点的numpy数组,然后将该bin中的所有行的选择添加value_counts到一个新的空数据have中。这会碰到MemoryError。我已经尝试了更多的预清理,但是即使将原始数据的大小减少三分之一(所以2GB,1亿行)仍然会出现内存错误。

代码语言:javascript
复制
SLICE_SIZE = 3600 # example value of 1h
slice_startpoints = np.arange(START_TIME, END_TIME+1-SLICE_SIZE, SLICE_SIZE)
agg_df = pd.DataFrame()

for timeslice in slice_startpoints:
        temp_slice = raw_data[raw_data['time_utc'].between(timeslice, timeslice + SLICE_SIZE)]
        temp_counts = temp_slice['obs_id'].value_counts()
        agg_df = agg_df.append(temp_counts)
        temp_index = raw_data[raw_data['time_utc'].between(timeslice, timeslice + SLICE_SIZE)].index
        raw_data.drop(temp_index, inplace=True)

有没有办法更有效地做到这一点,或者更确切地说,它是有效的呢?

编辑:根据使用交叉表的建议,我找到了一种高效的方法。不需要缩小文件大小。使用下面的代码可以得到我想要的结果。

代码语言:javascript
复制
df['binned'] = pd.cut(df['time_utc'], bins=slice_startpoints, include_lowest=True, labels=slice_startpoints[1:])
df.groupby('binned')['obs_id'].value_counts().unstack().fillna(0)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-29 07:22:02

您可以尝试使用cutcrosstab

代码语言:javascript
复制
slice_startpoints = np.arange(START_TIME, END_TIME+SLICE_SIZE, SLICE_SIZE)
print (slice_startpoints)

df['binned'] = pd.cut(df['time_utc'], 
                      bins=slice_startpoints, 
                      include_lowest=True,
                      labels=slice_startpoints[1:])

df = pd.crosstab(df['binned'], df['obs_id'])
票数 0
EN

Stack Overflow用户

发布于 2020-02-29 13:26:47

您可以使用“块”迭代器在大型.csv中读取,然后对块执行计算,而不是对整个.csv文件执行计算。块大小定义单个块中的行数。这样,就有了一个很好的句柄来控制内存使用。缺点将是,您将不得不添加一些逻辑,这将合并的结果块。

代码语言:javascript
复制
import pandas as pd
df_chunk = pd.read_csv('file.csv', chunksize=1000)
for chunk in df_chunk:
    print(chunk)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60462829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档