我有Dask系列的Dask数据帧。
我想在本系列中建立索引,以获取dask数据帧以供后续工作使用。
但是,使用loc[0]会导致另一个dask系列。使用to_frame也不起作用,因为结果是"Dask系列Dask数据帧的Dask数据帧“。
下面是一个使用Dask系列Pandas数据帧的最小示例(不完全相同,但说明了问题):
import pandas as pd
import dask.dataframe as dd
pdf1 = pd.DataFrame({'a': [1,2,3,4], 'b': [4,3,2,1]})
pdf2 = pd.DataFrame({'a': [4,3,2,1], 'b': [1,2,3,4]})
ps = pd.Series([pdf1, pdf2])
ds = dd.from_pandas(ps, npartitions=1)
print(type(ds.loc[0])) # still dask series
print(type(ds.loc[1])) # still dask series
print(ds.compute().loc[0]) # this is a pandas dataframe
print(ds.loc[0].compute()) # this is a pandas series
print(ds.loc[0].compute().loc[0]) # need to index into the singleton series to get back the dataframe看起来,一旦对象成为dask序列,所有后续的组合器都会将其作为dask序列保留,直到返回“单例”pandas序列的compute。
有没有办法让dask按照我期望的类型来处理索引对象?
发布于 2020-02-16 06:42:45
我怀疑这是因为Dask不知道只有一个索引值的值为0。原则上,可能有很多索引值为0的行,因此.loc的一般输出类型是序列。
当我们拥有唯一值的索引时,这与我们的直觉背道而驰,这可能会导致您似乎遇到的那种挫败感。
发布于 2020-02-04 20:52:37
您可能有将数据帧保存在一个系列中的原因,但我猜将原始数据帧作为分区保留在dask中会更好。然后,您可以使用concat加入它们,如下例所示:
import pandas as pd
import dask.dataframe as dd
pdf1 = pd.DataFrame({'a': [1,2,3,4], 'b': [4,3,2,1]})
pdf2 = pd.DataFrame({'a': [4,3,2,1], 'b': [1,2,3,4]})
ddf1 = dd.from_pandas(pdf1, npartitions=1)
ddf2 = dd.from_pandas(pdf2, npartitions=1)
ddf = dd.concat([ddf1, ddf2], axis=0)
ddf.compute()您可以使用ddf.partitions[0].compute()访问第一个分区
更重要的是,如果您对原始数据帧进行了索引,并且对索引进行了排序,并且索引不重叠,则concat将正确设置连接的数据帧的划分,而无需重新索引。您可以使用ddf.divisions检查分区,它将在本例中显示(None, None, None),但如果您从正确的索引开始,则可以正确地显示分区。
https://stackoverflow.com/questions/60032403
复制相似问题