使用取反范围对DataFrame索引进行Dask过滤器

时间:2019-01-11 18:27:45

标签: python-3.x pandas dask

我的用例是每天处理约100MB。我将Pandas DataFrame用作单个文件,但是由于Pandas倾向于根据不同日期的数据强制dtypes,因此此操作失败。我尝试使用Dask DataFrame读取这些内容,但由于架构不同,它失败了。具有描述性的列名和717列的异常消息是无法处理的(100KB的固定长度的密集二进制字符串)。

因此,我尝试使用Dask编写一个大型实木复合地板,并希望它能整理出dtypeskduggery熊猫。有时,我需要在已经拥有的所有日期数据的中间重新处理一两天。

到目前为止,我设法做到这一点,这非常丑陋,我不禁想到还有更好的方法。似乎没有办法在read_parquet中使用过滤器,因为我们对索引进行过滤。似乎没有办法否定索引值的范围。索引只是一个日期,没有小时,等等。df是一天中的数据,而mdf是我的mega-df,其中包含了几年的数据

            mdf = dd.read_parquet(self.local_location + self.megafile, engine='pyarrow')
            inx = df.index.unique()
            start1 = '2016-01-01'
            end1 = pd.to_datetime(inx.values.min()).strftime('%Y-%m-%d')
            start2 = pd.to_datetime(inx.values.max()).strftime('%Y-%m-%d')
            end2 = '2029-01-01'
            mdf1 = mdf[start1:end1]
            mdf2 = mdf[start2:end2]
            if len(mdf1) > 0:
                df_usage1 = 1 + mdf1.memory_usage(deep=True).sum().compute() // 100000001

                if len(mdf2) > 0:
                    df_usage2 = 1 + mdf1.memory_usage(deep=True).sum().compute() // 100000001
                    mdf1 = mdf1.append(mdf2, npartitions=df_usage2)
            else:
                if len(mdf2) > 0:
                    df_usage2 = 1 + mdf2.memory_usage(deep=True).sum().compute() // 100000001
                    mdf1 = dd.from_pandas(df).append(mdf2, npartitions=df_usage2)

这也会在

处引发异常
mdf1 = mdf1.append(df, npartitions=df_usage1)

{ValueError}Exactly one of npartitions and chunksize must be specified.

这很有趣,因为那正是我在做什么。

df_usage2在这种情况下= 2

寻求更好的替代方法,也许可以解释附录中的实际错误。

1 个答案:

答案 0 :(得分:0)

我建议不要提供npartitions=关键字