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