簡體   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