亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何計算一列熊貓DataFrame中的一組

如何計算一列熊貓DataFrame中的一組

守著一只汪 2022-10-18 17:01:39
在數據框中我有列標志,我想在列中計算 1 組df=pd.DataFrame({'flag':[1,1,0,1,0,1,1,0,1,1,1]}) df_out=pd.DataFrame({'groups_of_one_count':[4]}) 
查看完整描述

4 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

使用沒有任何附加/連接的 NumPy,再次為了性能 -


a = df.flag.values

out = (a[1:]>a[:-1]).sum() + (a[0]==1)

解釋:我們尋找下一個大于前一個的元素。如果滿足,則表示一個島/組的開始1s。我們只是得到總和作為最終輸出。對于極端情況,當這樣的組從第一個元素開始時,我們單獨捕獲它。


給定樣本的時間按比例放大10000x-


In [64]: df=pd.DataFrame({'flag':[1,1,0,1,0,1,1,0,1,1,1]})


In [65]: df = pd.concat([df]*10000)


# @Quang Hoang's soln

In [66]: %timeit (np.diff(np.append(df.flag.values,0)) == -1).sum()

362 μs ± 26.1 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


# From this post

In [67]: %%timeit   

    ...: a = df.flag.values

    ...: out = (a[1:]>a[:-1]).sum() + (a[0]==1)

191 μs ± 5.4 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


# @jezrael's soln

In [68]: %timeit (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()

1.39 ms ± 8.86 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


# @YOBEN_S's soln

In [69]: %timeit df[df.flag.ne(0)].index.to_series().diff().ne(1).sum()

2.92 ms ± 209 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

一般情況(當可能有除 0 和 1 以外的數字時)

該解決方案將通過獲取要搜索的數字掩碼(1此處)并對其進行操作來修改為這些方面的內容 -


a = df.flag.values

m = a==1

out = (m[1:] & ~m[:-1]).sum() + m[0]


查看完整回答
反對 回復 2022-10-18
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

ne想法是通過不等于比較連續組Series.shift并僅過濾具有以下內容的組1


a = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()

print (a)

4


df_out=pd.DataFrame({'groups_of_one_count':[a]}) 

print (df_out)

   groups_of_one_count

0                    4

詳情:


print (df.assign(consec=df['flag'].ne(df['flag'].shift()),

                 eq1 = df['flag'].eq(1),

                 chained = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1))

       ))

    flag  consec    eq1  chained

0      1    True   True     True

1      1   False   True    False

2      0    True  False    False

3      1    True   True     True

4      0    True  False    False

5      1    True   True     True

6      1   False   True    False

7      0    True  False    False

8      1    True   True     True

9      1   False   True    False

10     1   False   True    False


查看完整回答
反對 回復 2022-10-18
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

使用純 numpy 可以提高性能:

(np.diff(np.append(df.flag.values,0)) == -1).sum()

思路1:統計數據從到跳轉的次數0。我們使用為系列以 結尾的情況np.append添加尾隨,以便包含最后一個塊。01


查看完整回答
反對 回復 2022-10-18
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

首先,我們選擇index不等于0,并找到索引diff,如果差異不繼續(這里不是eq 1),那就是不同的組:

df[df.flag.ne(0)].index.to_series().diff().ne(1).sum()
4


查看完整回答
反對 回復 2022-10-18
  • 4 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號