繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM