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用于子集化,我该怎么做?
编辑
可能,您的问题来自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)
| 归档时间: |
|
| 查看次数: |
5127 次 |
| 最近记录: |