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

时间:2019-02-02 02:57:14

标签: python subset dask loc

我试图通过使用命令FirebaseApp.configure() UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in }) application.registerForRemoteNotifications() InstanceID.instanceID().instanceID { (result, _) in if result != nil { // Receive notifications from the "all" topic Messaging.messaging().subscribe(toTopic: "all") } } 从dask.dataframe中仅选择一行。它返回4行,所有行都有x.loc[0].compute()。我尝试了index=0,但重设后仍然有4行包含reset_index。 (我认为我确实进行了正确的重置,因为我做了index=0,因此可以在新列中看到原始索引。)

我阅读了reset_index(drop=False)文档,并说了一句,dask.dataframe可能由于结构数据的结构化程度太高而与行数不一。

那么,如果我真的只想通过使用index=0进行子集仅一行,那我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

修改 您的问题可能来自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

具有重复的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对其进行切片并执行以下操作(我想通过0选择loc标签的意思是“选择第一行”):

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个分区的表)产生新的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