在Pandas中将set_index转换为Dask更好,反之亦然吗?

时间:2019-06-05 16:39:05

标签: pandas dask

Dask文档指出,Dask的set_index比Pandas(http://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.DataFrame.set_index)昂贵得多

请记住,以下哪一项是最佳做法(“时间”列中填充了日期时间对象)。

Dask中的set_index:

        df['time_index'] = df['time']
        df = dd.from_pandas(df, npartitions=100)
        df = df.set_index('time_index', sorted=True)

熊猫的set_index

        df['time_index'] = df['time']
        df = df.set_index('time_index')
        df = dd.from_pandas(df, npartitions=100)

我也欢迎任何建议来改进示例代码。

1 个答案:

答案 0 :(得分:1)

我想知道为什么您需要一个将time列复制到time_index的示例?

创建df

import numpy as np
import pandas as pd
import dask.dataframe as dd


N =  int(1e7)
times = pd.date_range(start="2019-01-01", periods=N, freq="1s")
df = pd.DataFrame({"time":times,
                   "value":np.random.randn(N)})

df.to_csv("df.csv", index=False)
df.to_parquet("df.parq")

设置熊猫索引

%%time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = df.set_index("time")
df = dd.from_pandas(df, npartitions=100)

a = df.divisions

CPU times: user 10.7 s, sys: 503 ms, total: 11.2 s
Wall time: 9.81 s

在dask中设置索引

time
df = pd.read_csv("df.csv", parse_dates=['time'])
df = dd.from_pandas(df, npartitions=100)
df = df.set_index("time", sorted=True)
b = df.divisions

CPU times: user 11.3 s, sys: 534 ms, total: 11.8 s
Wall time: 10.4 s

划分相同

print(a==b)

True

快读

这里,只要我们从time中读取,就可以使用infer_division并将parquet用作索引。

%%time
df = dd.read_parquet("df.parq", index="time", infer_divisions=True)
df = df.repartition(npartitions=100)
c = df.divisions

CPU times: user 9.54 ms, sys: 22 µs, total: 9.56 ms
Wall time: 8.9 ms

在这种情况下,划分是不同的

print(c==a)

False

但这没什么大不了

print(c[:2])

(Timestamp('2019-01-01 00:00:00'),
Timestamp('2019-01-02 03:46:39.990000128'))

结论

我建议您直接从镶木地板上阅读。您的文件将变得更小,而不必指定数据类型

!ls -lh df.*

-rw-rw-r-- 1 username username 378M Jun  5 14:59 df.csv
-rw-rw-r-- 1 username username 164M Jun  5 14:59 df.parq