如何在 dask.dataframe 中对一行进行子集化?

Kor*_*kdi 1 python subset loc dask

我正在尝试使用 command 从 dask.dataframe 中仅选择一行x.loc[0].compute()。它返回 4 行,所有行都具有index=0. 我试过了reset_index,但index=0重置后仍然会有 4 行。(我想我确实正确重置了,因为我做到了reset_index(drop=False)并且我可以在新列中看到原始索引)。

我阅读了dask.dataframe文档,它说,index=0由于 dask 如何构造块数据,可能会有不止一行的内容。

所以,如果我真的只想要一行index=0用于子集化,我该怎么做?

Mik*_*nov 5

编辑 可能,您的问题来自reset_index. 这个问题在答案的最后解释。前面部分的文字就是如何解决它。

例如,有以下 dask DataFrame:

import pandas as pd
import dask
import dask.dataframe as dd
 
 
df = pd.DataFrame({'col_1': [1,2,3,4,5,6,7], 'col_2': list('abcdefg')}, 
                  index=pd.Index([0,0,1,2,3,4,5]))
df = dd.from_pandas(df, npartitions=2)
df.compute()
Out[1]: 
   col_1 col_2
0      1     a
0      2     b
1      3     c
2      4     d
3      5     e
4      6     f
5      7     g
Run Code Online (Sandbox Code Playgroud)

它有一个带有重复0值的数字索引。作为loc一个

纯粹基于标签位置的索引器,用于按标签选择

- 它选择两个0-labeled 值,如果你会做

df.loc[0].compute()
Out[]: 
   col_1 col_2
0      1     a
0      2     b
Run Code Online (Sandbox Code Playgroud)

- 您将获得带有0-s(或其他指定标签)的所有行。

pandas有一个pd.DataFrame.iloc帮助我们通过它的数值指标来选择一行。不幸的是,在DASK你不能这样做,因为iloc

纯粹基于整数位置的索引,用于按位置选择。

仅支持索引列位置。尝试选择行位置将引发 ValueError。

为了解决这个问题,你可以做一些索引技巧:

df.compute()
Out[2]: 
   index  col_1 col_2
x                    
0      0      1     a
1      0      2     b
2      1      3     c
3      2      4     d
4      3      5     e
5      4      6     f
6      5      7     g
Run Code Online (Sandbox Code Playgroud)

- 现在,有一个新的索引,范围从0到数据框的长度 - 1

可以将其切片loc并执行以下操作(我认为选择0标签通过loc表示“选择第一行”):

df.loc[0].compute()
Out[3]: 
   index  col_1 col_2
x                    
0      0      1     a
Run Code Online (Sandbox Code Playgroud)

关于乘以 0 的索引标签
如果您需要原始索引,它仍然在这里,可以通过

df.loc[:, 'index'].compute()
Out[4]: 
x
0    0
1    0
2    1
3    2
4    3
5    4
6    5
Run Code Online (Sandbox Code Playgroud)

我想,你会从reset_index()左右得到这样的重复,因为它为每个分区指定了新的 0 开始索引,例如,对于这个包含 2 个分区的表:

df.reset_index().compute()
Out[5]: 
   index  col_1 col_2
0      0      1     a
1      0      2     b
2      1      3     c
3      2      4     d
0      3      5     e
1      4      6     f
2      5      7     g
Run Code Online (Sandbox Code Playgroud)