簡體   English   中英

使用 python pandas 將行值轉換為列以將日期字段分配給每個新列

[英]Convert row values to columns to assign date field to each new column using python pandas

我正在嘗試將具有兩個不同值的行轉換為在每列下捕獲日期的列。

我的 Dataframe 看起來像這樣。 Eventype 1.0 是我對特定網絡節點的開始日期,其連續 EventType 值 = 5 是我的結束日期。 因此,我想將 Eventype 值轉換為列以找出開始日期和結束日期。

EventID NetworkNode EventTime   EventType
1140085 606.0   2018-09-12 14:11:00 1.0
1140416 606.0   2018-09-12 16:39:00 5.0
1141105 606.0   2018-09-12 22:16:00 1.0
1141109 606.0   2018-09-12 22:19:00 5.0
1141288 421.0   2018-09-12 23:21:00 5.0
1141295 508.0   2018-09-12 23:23:00 5.0
1141568 647.0   2018-10-12 01:09:00 1.0
1141578 647.0   2018-10-12 01:12:00 5.0
1142463 461.0   2018-10-12 05:52:00 1.0
1142467 460.0   2018-10-12 05:53:00 1.0
1142468 502.0   2018-10-12 05:54:00 1.0
1142476 502.0   2018-10-12 05:57:00 5.0
1142493 461.0   2018-10-12 06:00:00 5.0
1142516 460.0   2018-10-12 06:01:00 5.0
1145299 629.0   2018-10-12 21:13:00 1.0
1145411 629.0   2018-10-12 22:16:00 5.0
1145414 629.0   2018-10-12 22:23:00 1.0
1145437 629.0   2018-10-12 22:26:00 5.0
1145437 421.0   2018-10-12 22:26:00 5.0


df = df[['EventID','NetworkNode', 'EventTime', 'EventType']].sort_values(by=['EventID'])

df = df.set_index(['NetworkNode','EventType'])['EventTime'].unstack()

我嘗試了這段代碼,但給出了錯誤,

“ValueError:索引包含重復的條目,無法重塑”,因為網絡節點有重復。

我想要的 Output 應該是這樣的。

EventType 列中的值“1.0”表示該網絡節點的該事件的開始日期和時間,同一網絡節點的連續值“5.0”將是結束時間。 因此,我想通過開始和結束時間將這些 2 行轉換為 1 行。

NetworkNode   1.0                      5.0
606.0       2018-09-12 14:11:00     2018-09-12 16:39:00
606.0           2018-09-12 22:16:00     2018-09-12 22:19:00
421.0           2018-09-12 23:21:00 2018-10-12 23:26:00
508.0                               2018-09-12 23:23:00
647.0           2018-10-12 01:09:00 2018-10-12 01:12:00
461.0           2018-10-12 05:52:00 2018-10-12 06:00:00
460.0           2018-10-12 05:53:00 2018-10-12 06:01:00
502.0           2018-10-12 05:54:00 2018-10-12 05:57:00
629.0           2018-10-12 21:13:00 2018-10-12 22:16:00
629.0           2018-10-12 22:23:00 2018-10-12 22:26:00

請指教....

到目前為止我可以回答

主要問題是:要形成這樣的 Pivot 表,您需要唯一索引,索引不能重復,所以在這里我有 2 個選項可以與您分享

1)將EventID和NetworkNode拼接在一起,使其成為唯一的Index,形成pivot表

data = pd.read_csv(path, encoding="ISO-8859-1")
data_cp = data.copy()
data["Node_ID"] = ""
for x in range(len(data)):
    data["Node_ID"][x] = str(data["NetworkNode"][x]) + "_" + str(data["EventID"][x])
data.pivot(index='Node_ID', columns='EventType', values='EventTime')

運行時結果是這樣的: 索引是 NodeID

2) 使用這 2 個 Key -> NetworkNode 和 EventType 簡單地做 Groupby (不需要讓它成為索引)

data_cp = data.copy()
data_cp.drop(columns=["EventID"], inplace=True)
view = data_cp.groupby(by=['NetworkNode','EventType'])["EventTime"]
view.first()

按 2 列分組

暫無
暫無

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

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