[英]How to subset one row in dask.dataframe?
我试图通过使用命令x.loc[0].compute()
从dask.dataframe中仅选择一行。 它返回4行,所有行的index=0
。 我尝试过reset_index
,但是重置后仍然会有4行的index=0
。 (我认为我确实进行了正确的重置,因为我做了reset_index(drop=False)
并且可以在新列中看到原始索引)。
我阅读了dask.dataframe
文档,并说了一些话,由于dask.dataframe是如何构造块数据的,因此可能有不止一排index=0
行。
那么,如果我真的只想通过使用index=0
进行子集设置一行,该如何做呢?
编辑可能是您的问题来自reset_index
。 答案的末尾将说明此问题。 本文的较早部分只是如何解决它。
例如,有以下令人讨厌的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
它具有重复的0
值的数字索引。 由于loc
是一个
纯粹基于标签位置的索引器,可按标签选择
-如果您将选择一个0
标记的值,
df.loc[0].compute()
Out[]:
col_1 col_2
0 1 a
0 2 b
-您将获得所有带有0
-s(或另一个指定标签)的行。
在pandas
有一个pd.DataFrame.iloc
可以帮助我们通过数字索引选择行。 不幸的是,您不能这样做,因为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
-现在,新索引的范围从0
到数据帧的长度1
。
可以用loc
对其进行切片并执行以下操作(我想通过loc
选择0
标签意味着“选择第一行”):
df.loc[0].compute()
Out[3]:
index col_1 col_2
x
0 0 1 a
关于乘以0的索引标签
如果您需要原始索引,它仍然在这里,可以通过
df.loc[:, 'index'].compute()
Out[4]:
x
0 0
1 0
2 1
3 2
4 3
5 4
6 5
我猜想,您从reset_index()
左右得到了这样的重复,因为它会为每个分区(例如,针对2个分区的表reset_index()
生成新的0开头的索引:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.