簡體   English   中英

計算dask.dataframe中某些值的出現次數

[英]Count occurrences of certain values in dask.dataframe

我有這樣的數據幀:

df.head()
   day      time  resource_record  
0   27  00:00:00             AAAA  
1   27  00:00:00                A  
2   27  00:00:00             AAAA  
3   27  00:00:01                A  
4   27  00:00:02                A  

並想知道某些resource_records存在多少次。

我的第一次嘗試是使用value_counts()返回的系列,這看起來很棒,但之后不允許我排除一些標簽,因為在dask.Series沒有實現drop()

所以我試着不打印不需要的標簽:

for row in df.resource_record.value_counts().iteritems():
    if row[0] in ['AAAA']:
        continue
    print('\t{0}\t{1}'.format(row[1], row[0]))

哪個工作正常,但如果我想進一步處理這些數據並真的希望它“清理”怎么辦? 所以我搜索了一些文檔並找到了mask() ,但這也有點笨拙:

records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts()

我找了一個允許我只計算單個值的方法,但count()會計算所有不是NaN的值。

然后我找到了str.contains() ,但我不知道如何處理我用以下代碼返回的未記錄的Scalar類型:

print(df.resource_record.str.contains('A').sum())

輸出:

dd.Scalar<series-..., dtype=int64>

但即使在查看了dask/dataframe/core.py中的Scalar代碼之后,我也找不到獲取其價值的方法。

您如何有效地計算數據框中某組值的出現次數?

在大多數情況下,pandas語法也可以與dask一起使用,必須添加.compute() (或dask.compute )來實際執行操作。 在計算之前,您只是構建定義動作的圖形。

我相信你問題的最簡單的解決方案是:

df[df.resource_record!='AAAA'].resource_record.value_counts().compute()

其中選擇器方括號中的表達式可以是某些映射或函數。

我找到的一個非常好的方法是:

counts = df.resource_record.mask(df.resource_record.isin(['AAAA'])).dropna().value_counts()

首先,我們屏蔽我們要刪除的所有條目,這將用NaN替換該值。 然后我們使用NaN刪除所有行,並最后計算唯一值的出現次數。

這要求df不具有NaN值,否則會導致包含NaN的行也被除去。

我期待類似的東西

df.resource_record.drop(df.resource_record.isin(['AAAA']))

會更快,因為我相信drop會在數據集中運行一次,而mask + dropna會在數據集中運行兩次。 但是drop僅針對axis = 1實現,這里我們需要axis = 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM