以下是我的 DataFrame 中的一些行,組成如下:
Index ['TimeStamp'] ['ThreadID'] ['Start|End'] ['StepIdentifier']
1017 18:44:22,997 [12] Start FetchMasterData
1018 18:44:22,997 [12] Start GetSmrCalculatedMeterData
1020 18:44:22,997 [12] End GetSmrCalculatedMeterData
1021 18:44:22,997 [12] Start GetSmrPhysicalMeterData
1023 18:44:23,013 [12] End GetSmrPhysicalMeterData
1024 18:44:23,013 [12] Start GetSmrMarketDeliveryPointData
1026 18:44:23,013 [12] End GetSmrMarketDeliveryPointData
1027 18:44:23,013 [12] Start GetSmrMarketHeadpointData
1029 18:44:23,013 [12] End GetSmrMarketHeadpointData
1030 18:44:23,013 [12] End FetchMasterData
我需要為每個執行緒獲取每個行程的開始和結束時間。我們可以看到,行程(如 FetchMasterData)的“開始”和“結束”不一定相互跟隨。
為了像這樣創建一個新的 DataFrame:
['ThreadID'] ['StepIdentifier'] ['Start'] ['End']
[12] FetchMasterData 18:44:22,997 18:44:23,013
我嘗試將具有流程開始的行與以下所有流程進行比較,直到找到流程結束,然后在新資料框中創建一行:
def iterateDfStartEnd(df):
df = createDataFrame() // Function to create the DataFrame shown above
new_df = pd.DataFrame(columns=['ThreadID','StepIdentifier','StartTime','EndTime'])
j = 1013 // Because i starts at 1012(like j = i 1) and i ends at 1140
for i in df.index
while(df.iloc[i,'End|Start'] == "Start" & df.iloc[j,'End|Start'] == "End"
& df.iloc[i,'StepIdentifier'] == df.iloc[j,'StepIdentifier']
& df.iloc[i,'ThreadID'] == df.iloc[j,'ThreadID'] & j < 1141):
j = 1
new_df['ThreadID'] = df.iloc[i,'ThreadID']
new_df['StepIdentifier'] = df.iloc[i,'StepIdentifier']
new_df['StartTime'] = df.iloc[i,'TimeStamp']
new_df['EndTime'] = df.iloc[j,'TimeStamp']
j = i 1
return new_df
最后為每個行程計算操作 Start 和 End 之間的時間,并擁有這樣的 DataFrame(僅供您參考):
['ThreadID'] ['StepIdentifier'] ['Time']
[12] FetchMasterData 16s
我不明白如何像我一樣通過比較行來迭代資料幀,我的索引有錯誤。有沒有人有另一種方法來創建新的資料框?感謝大家 !
編輯:非常感謝提出的 2 個解決方案,但有一個問題,“StepIdentifier”不是唯一的,它可以在 DataFrame 中出現多次,但開始和結束時間不同
像這樣 :
['TimeStamp'] ['ThreadID'] ['Start|End'] ['StepIdentifier']
18:44:22,997 [12] Start FetchMasterData
18:44:22,997 [12] Start GetSmrCalculatedMeterData
18:44:22,997 [12] End GetSmrCalculatedMeterData
18:44:22,997 [12] Start GetSmrPhysicalMeterData
18:44:23,013 [12] End GetSmrPhysicalMeterData
18:44:23,013 [12] End FetchMasterData
18:44:23,013 [12] Start GGetSmrCalculatedMeterData
18:44:23,023 [12] End GetSmrCalculatedMeterData
我們可以看到“StepIdentifier”“GetSmrCalculatedMeterData”出現了兩次。
這是一個重現此顯示的 DataFrame:
df = pd.DataFrame({'TimeStamp': ['18:44:22,997','18:44:22,997','18:44:22,997','18:44:22,997','18:44:23,013','18:44:23,013','18:44:23,013','18:44:23,023'],
'ThreadID': ['[12]','[12]','[12]','[12]','[12]','[12]','[12]','[12]'],
'Start|End': ['Start', 'Start', 'End', 'Start', 'End', 'End', 'Start', 'End'],
'StepIdentifier': ['FetchMasterData','GetSmrCalculatedMeterData','GetSmrCalculatedMeterData','GetSmrPhysicalMeterData','GetSmrPhysicalMeterData','FetchMasterData','GetSmrCalculatedMeterData','GetSmrCalculatedMeterData']})
uj5u.com熱心網友回復:
如果您想為相同StepIdentifier的相同ThreadID,那么您可以嘗試這樣的事情:
# sorting to make sure that the start and end time of the same process that took place on the same thread are one below the other
df = df.sort_values(by=['ThreadID', 'StepIdentifier', 'Timestamp'])
# assigning an inner group counter to distinguish same processes that took place on the same thread
df['group'] = df.groupby(['ThreadID', 'StepIdentifier', 'Start|End']).cumcount()
# unstacking to create the new columns
new_df = df.set_index(['ThreadID', 'StepIdentifier', 'group', 'Start|End']).unstack()
附上 MRE 的結果截圖:

uj5u.com熱心網友回復:
如果您的資料框始終只有一個開始時間和一個結束時間,則有一個相當簡單的解決方案。您.groupby()對 ThreadId 和 StepIdentifier 執行操作,然后將 TimeStamp 的最小值用于 Start,將最大值用于 End:
df = pd.DataFrame({'ts': ['18','19','20','21','22','23'],
'id': ['12','12','12','12','12','12'],
'se': ['Start', 'Start', 'End', 'Start', 'End', 'End'],
'event': ['stomp','cramp','stomp','break','cramp','break']})
g = df.groupby(["id",'event']).agg(Start = ('ts', lambda x: min(x)), End = ('ts', lambda x: max(x)))
g.reset_index()
輸出如下所示:
id event Start End
0 12 break 21 23
1 12 cramp 19 22
2 12 stomp 18 20
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525788.html
標籤:Python熊猫数据框
