如何在Dask中重置连接数据框架的索引?

我是Dask新手,认为这将是一个简单的任务。 我想从多个csv文件中加载数据,并将其合并到一个Dask数据框架中。在这个例子中,有5个csv文件,每个文件中有10,000行数据。 很明显,我想给组合后的数据框架一个唯一的索引。

所以我这样做了。

import dask.dataframe as dd

# Define Dask computations
dataframes = [
    dd.read_csv(os.path.join(data_dir, filename)).set_index('Unnamed: 0')
    for filename in os.listdir(data_dir) if filename.endswith('.csv')
]

combined_df = dd.concat(dataframes).reset_index(drop=True)

如果我这样做 combined_df.head().index 我如愿以偿地得到了这个。

RangeIndex(start=0, stop=5, step=1)

但是 combined_df.tail().index 不符合预期。

RangeIndex(start=3252, stop=3257, step=1)

进一步的检查显示,指数值在 combined_df 由15个独立的系列组成,长度大约为3256,加起来总长度为50000。 请注意,csv文件的第一列都包含一个从0到10000的索引。

这是怎么回事,我怎样才能得到一个标准的从0到50000的整数索引,也就是所有csv文件的总行数?

背景资料

如果你需要测试上面的代码,这里有一个设置脚本来创建一些csv文件。

import os
import numpy as np
import pandas as pd

# Create 5 large csv files (could be too big to fit all in memory)
shape = (10000, 1000)

data_dir = 'data'
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

for i in range(5):
    filepath = os.path.join(data_dir, f'datafile_{i:02d}.csv')
    if not os.path.exists(filepath):
        data = (i + 1) * np.random.randn(shape[0], shape[1])
        print(f"Array {i} size in memory: {data.nbytes*1e-6:.2f} MB")
        pd.DataFrame(data).to_csv(filepath)

UPDATE:

同样的问题似乎也发生在这个方法上。

combined_df = dd.read_csv(os.path.join(data_dir, '*.csv'))
print(dd.compute(combined_df.tail().index)[0])
print(dd.compute(combined_df.reset_index(drop=True).tail().index)[0])

RangeIndex(start=3252, stop=3257, step=1)
RangeIndex(start=3252, stop=3257, step=1)

在我看来 reset_index 方法产生相同的索引。

解决方案:

在这个例子中,有5个csv文件,有10,000行… 掩码 版本。重置指数 执行任务 分别(并同时)在每个分区上,所以在index “restart “中的连续数字作为一些点,实际上是在每个分区的开始。

为了规避这个限制,你可以

  • 分配一个新的列来填充 1.
  • 将指数设置为 cumsum() – 1 在这一列上计算(幸运的是,与此相反的是 重置指数, 阴毛 的计算方法。DataFrame)。

一个副作用是,索引的名称现在是这个newcolumn的名称,如果你想清除它,你必须在分区级别进行,调用map_partitions.

所以整个代码可以。

ddf = ddf.assign(idx=1)
ddf = ddf.set_index(ddf.idx.cumsum() - 1)
ddf = ddf.map_partitions(lambda df: df.rename(index = {'idx': None}))

注意: assign(idx=1) 是确定的,因为这显然 单一 价值是播出 到整个DataFrame的长度,所以 每个元素在这个新列中,将被设置为 1而我却不知道DataFrame包含多少行。这也是底层软件的一大特点。Numpy 软件包,它大大简化了编程 Numpy, 熊猫 并在 掩码.

然后你可以运行。ddf.compute() 就可以看到结果了

给TA打赏
共{{data.count}}人
人已打赏
未分类

在asp.NET MVC中存储API访问密钥的最佳实践。

2022-9-9 8:37:16

未分类

如何在db laravel 6中添加活动类到菜单中?

2022-9-9 8:37:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索