我正在嘗試確定哪些連續行在一列中至少有 50 個重復項。然后我希望能夠以匯總的方式讀取哪些行具有重復項,即
start end total
9 60 51
200 260 60
我試圖將開始和結束分開,以便以后可以獨立呼叫它們。我有這個打開 .csv 檔案并讀取其內容:
df = pd.read_csv("BN4 A4-F4, H4_row1_column1_watershed_label.csv", header=None)
df.groupby(0).filter(lambda x: len(x) > 0)
這給了我這個:
0
0 52.0
1 65.0
2 52.0
3 52.0
4 52.0
... ...
4995 8.0
4996 8.0
4997 8.0
4998 8.0
4999 8.0
5000 rows × 1 columns
我有很多問題。1)我不確定我是否完全理解第二個功能。似乎應該將我列中的數字組合在一起。這段代碼:
df.groupby(0).count()
給了我這個:
0
0.0
1.0
2.0
3.0
4.0
...
68.0
69.0
70.0
71.0
73.0
65 rows × 0 columns
我假設這意味著我的專欄中共有 65 個不同的唯一身份。這只是沒有告訴我它們是什么或它們在哪里。我以為這就是這個人會做的
df.groupby(0).filter(lambda x: len(x) > 0)
但是如果我將 0 更改為其他任何內容,那么它會破壞我生成的串列。
問題 2)我認為為了獲得序列中重復項的數量以及它們所在的行,我可能需要使用 for 回圈,但我不確定如何構建它。到目前為止,我整天都在竭力想弄清楚它,但我只是覺得我對 Python 的了解還不夠好。
請問我能得到一些幫助嗎?
更新
謝謝!這就是我要感謝@piterbarg:
#function to identify which behaviors have at least 49 frames, and give the starting, ending, and number of frames
def behavior():
df2 = (df
.reset_index()
.shift(periods=-1)
.groupby((df[0].diff() != 0).cumsum()) #if the diff between a row and the prev row is not 0, increase cumulative sum
.agg({0 : 'mean', 'index':['first','last',len]})) #mean is the behavior category
df3 = (df2.where(df2[('index','len')]>49)
.dropna() #drop N/A
.astype(int) #type = int
.reset_index(drop = True))
print(df3)
out:
0 index
mean first last len
0 7 32 87 56
1 19 277 333 57
2 1 785 940 156
3 30 4062 4125 64
4 29 4214 4269 56
5 7 4450 4599 150
6 1 4612 4775 164
7 7 4778 4882 105
8 8 4945 4999 56
當前的問題是試圖使資料框包含我的 .csv 的最后一行。如果有人碰巧看到這個,我會喜歡你的意見!
uj5u.com熱心網友回復:
讓我們從模擬 df 開始:
import numpy as np
np.random.seed(314)
df=pd.DataFrame({0:np.random.randint(10,size = 5000)})
# make sure we have a couple of large blocks
df.loc[300:400,0] = 5
df.loc[600:660,0] = 4
首先,我們確定連續數字發生變化的位置,以及groupby每個這樣的組。我們記錄它從哪里開始,在哪里結束,以及每組的大小
df2 = (df.reset_index()
.groupby((df[0].diff() != 0).cumsum())
.agg({'index':['first','last',len]})
)
然后我們只選擇那些超過 50 的組
(df2.where(df2[('index','len')]>50)
.dropna()
.astype(int)
.reset_index(drop = True)
)
輸出:
index
first last len
0 300 400 101
1 600 660 61
對于您關于做什么的問題df.groupby(0).filter(lambda x: len(x) > 0),據我所知,它什么也沒做。它按第 0 列中的不同值進行分組,然后丟棄那些大小為 0 的組,根據定義,它們都不是。所以這會回傳你的完整 df
編輯
您的代碼不太正確,應該是
def behavior():
df2 = (df.reset_index()
.groupby((df[0].diff() != 0).cumsum())
.agg({0 : 'mean', 'index':['first','last',len]}))
df3 = (df2.where(df2[('index','len')]>50)
.dropna()
.astype(int)
.reset_index(drop = True))
print(df3)
請注意,我們定義并回傳df3不是 df2,并且我修改了代碼以回傳mean列中重復的值(抱歉名稱不是很直觀,但您可以根據需要更改它們)
first是重復開始時的索引,last是最后一個索引,len是那里有多少個元素。
uj5u.com熱心網友回復:
#function to identify which behaviors have at least 49 frames, and give the starting, ending, and number of frames
def behavior():
df2 = (df.reset_index()
.groupby((df[0].diff() != 0).cumsum()) #if the diff between a row and the prev row is not 0, increase cumulative sum
.agg({0 : 'mean', 'index':['first','last',len]})) #mean is the behavior category
.shift(-1)
df3 = (df2.where(df2[('index','len')]>49)
.dropna() #drop N/A
.astype(int) #type = int
.reset_index(drop = True))
print(df3)
產生這個:
0 index
mean first last len
0 7 31 86 56
1 19 276 332 57
2 1 784 939 156
3 31 4061 4124 64
4 29 4213 4268 56
5 8 4449 4598 150
6 1 4611 4774 164
7 8 4777 4881 105
8 8 4944 4999 56
我喜歡的。我確實注意到,具有 56x 重復的“7”的組實際上從第 32 行開始,到第 87 行結束(在這兩種情況下只有一個,并且整個作業表中的模式都是一致的)。我是否相信這可以通過 shift() 函式以某種方式解決?我還在玩這個:D
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/410618.html
標籤:
