我有時間序列資料,其中有一列總結了某事正在運行的秒數。所有數字都可以被 30 整除,但有時它會跳過數字(可能從 30 跳到 90)。此列可以在運行時重置,將開始計數設定回 30 秒。我將如何分解運行時的每一塊。
例如:如果列中的數字是 30、60、120、150、30、60、90、30、60,我將如何將資料幀分解為完整的序列而無需重置。
1 個資料幀中有 30、60、120、150,下一個資料幀有 30、60、90,最后一個資料幀有 30、60?最后,我需要獲取每個資料幀的最大值并將它們加在一起(我可以弄清楚的那部分)。
uj5u.com熱心網友回復:
使用@RSale 的輸入:
import pandas as pd
df = pd.DataFrame({'data': [30, 60, 120, 150, 30, 60, 90, 30, 60]})
d = dict(tuple(df.groupby(df['data'].eq(30).cumsum())))
d 是三個資料幀的字典:
d[1]:
data
0 30
1 60
2 120
3 150
d[2]:
data
4 30
5 60
6 90
和 d[3}:
data
7 30
8 60
uj5u.com熱心網友回復:
不是很優雅,但它完成了作業。
回圈遍歷一個陣列。當數字小于之前的數字時,將陣列添加到串列中。從串列中洗掉保存的陣列并重復,直到沒有檢測到更改。
numpy 和遞回的
import numpy as np
a = np.array([30, 60, 120, 150, 30, 60, 90, 30, 60])
y = []
def split(a,y):
for count,val in enumerate(a):
if count == 0:
pass
elif val < a[count-1]:
y.append(a[:count])
a = a[count:]
if len(a)> 0 and sorted(a) != list(a):
split(a,y)
else:
y.append(a)
a = []
return(y)
return(y)
y = split(a,y)
print(y)
>>[array([ 30, 60, 120, 150]), array([30, 60, 90]), array([30, 60])]
print([max(lis) for lis in y])
>>[150,90,60]
這不會將 30 視為起點,而是重置后的最小數字。
或者使用 diff 來查找變化點。
numpy & diff 版本
import numpy as np
a = np.array([30, 60, 120, 150, 30, 60, 90, 30, 60])
y = []
def split(a,y):
a_diff = np.asarray(np.where(np.diff(a)<0))[0]
while len(a_diff)>1:
a_diff = np.asarray(np.where(np.diff(a)<0))[0]
y.append(a[:a_diff[0] 1])
a = a[a_diff[0] 1:]
y.append(a)
return(y)
y = split(a,y)
print(y)
print([max(lis) for lis in y])
>>[array([ 30, 60, 120, 150]), array([30, 60, 90]), array([30, 60])]
>>[150, 90, 60]
熊貓和 DataFrame 版本
import pandas as pd
df = pd.DataFrame({'data': [30, 60, 120, 150, 30, 60, 90, 30, 60]})
y = []
def split(df,y):
a = df['data']
a_diff = [count for count,val in enumerate(a.diff()[1:]) if val < 0 ]
while len(a_diff)>1:
a_diff = [count for count,val in enumerate(a.diff()[1:]) if val < 0 ]
y.append(a[:a_diff[0] 1])
a = a[a_diff[0] 1:]
y.append(a)
return(y)
y = split(df,y)
print(y)
print([max(lis) for lis in y])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408948.html
標籤:
