簡體   English   中英

使用 pandas 獲取每行一個特定值的最大出現次數

[英]Get maximum occurance of one specific value per row with pandas

我有以下 dataframe:

   1   2   3   4   5   6   7  8  9
0  0   0   1   0   0   0   0  0  1
1  0   0   0   0   1   1   0  1  0
2  1   1   0   1   1   0   0  1  1
...

我想為每一行獲取該行中值 0 的最長序列。 因此,這個 dataframe 的預期結果將是一個如下所示的數組:

[5,4,2,...]

與第一行一樣,最大序列 eof 值 0 是 5,等等。

我看過這篇文章並嘗試在第一行開始獲取它(盡管我想對整個數據幀立即執行此操作)但我遇到了錯誤:

s=df_day.iloc[0]
(~s).cumsum()[s].value_counts().max()

TypeError: 輸入類型不支持 ufunc 'invert',並且根據轉換規則 ''safe'' 無法將輸入安全地強制轉換為任何受支持的類型

當我手動插入這樣的值時:

s=pd.Series([0,0,1,0,0,0,0,0,1])
(~s).cumsum()[s].value_counts().max()

>>>7

我得到 7,這是行中總 0 的數量,但不是最大序列。 但是,我不明白為什么一開始它會引發錯誤,更重要的是,我想在 while dataframe 和每行最后運行它。

我的最終目標:連續獲得值 0 的最大不間斷出現。

每行計數連續0的向量化解決方案,因此最大使用max為 DataFrame c

#more explain https://stackoverflow.com/a/52718619/2901002
m = df.eq(0)
b = m.cumsum(axis=1)
c = b.sub(b.mask(m).ffill(axis=1).fillna(0)).astype(int)
print (c)
   1  2  3  4  5  6  7  8  9
0  1  2  0  1  2  3  4  5  0
1  1  2  3  4  0  0  1  0  1
2  0  0  1  0  0  1  2  0  0

df['max_consecutive_0'] = c.max(axis=1)
print (df)
   1  2  3  4  5  6  7  8  9  max_consecutive_0
0  0  0  1  0  0  0  0  0  1                  5
1  0  0  0  0  1  1  0  1  0                  4
2  1  1  0  1  1  0  0  1  1                  2

利用:

df = df.T.apply(lambda x: (x != x.shift()).astype(int).cumsum().where(x.eq(0)).dropna().value_counts().max())

OUTPUT

0    5
1    4
2    2

下面的代碼應該可以完成這項工作。

function longest_streak將計算連續零的數量並返回最大值,您可以在 df 上使用apply

from itertools import groupby
    def longest_streak(l):
      lst = []
      for n,c in groupby(l):
        num,count = n,sum(1 for i in c)
        if num==0:
          lst.append((num,count))

  maxx = max([y for x,y in lst])
  return(maxx)

df.apply(lambda x: longest_streak(x),axis=1)

暫無
暫無

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

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