<p>使用<a href="https://pandas.pydata.org/docs/reference/api/pandas.melt.html" rel="nofollow noreferrer">melt</a>。动态-更多列(>;3)仍将工作</p>
<pre><code>df = pd.read_csv(io.StringIO("""ID1 ID2 Event1 Event1_activity Event2 Event2_activity Event3 Event3_activity
10001A 6456 05.09.2019 12:32 Event1_Description 09.09.2019 12:40 Event2_Description 10.09.2019 12:40 Event3_Description
10001A 6456 05.09.2019 12:32 Event1_Description 09.09.2019 12:40 Event2_Description 10.09.2019 12:40 Event3_Description
20001B 8793 03.09.2019 09:45 Event1_Description 10.09.2019 12:25 Event2_Description 11.09.2019 12:25 Event3_Description
20001B 9017 03.09.2019 09:49 Event1_Description 10.09.2019 12:25 Event2_Description 11.09.2019 12:25 Event3_Description
20001B 5454 04.09.2019 12:42 Event1_Description 10.09.2019 12:25 Event2_Description 11.09.2019 12:25 Event3_Description"""
), sep="\s\s+", engine="python")
# pepare ID column as concatenation
df = df.assign(ID=lambda dfa: dfa["ID1"].astype(str)+"-"+dfa["ID2"].astype(str)).drop(columns=["ID1","ID2"])
# melt out both sets of columns for Event and Activity then merge
# NB reset_index() to ensure merge key works. Plus only want ID on LHS dataframe
df2 = pd.merge(
pd.melt(df, id_vars=["ID"],
value_vars=[c for c in df.columns if "Event" in c and "activity" not in c],
value_name="Event").drop(columns="variable").reset_index(),
pd.melt(df, id_vars=["ID"],
value_vars=[c for c in df.columns if "activity" in c],
value_name="Activity").drop(columns=["variable","ID"]).reset_index(),
on="index"
).drop(columns="index").sort_values(["ID","Event"])
</code></pre>
<h2>输出</h2>
<pre><code> ID Event Activity
10001A-6456 05.09.2019 12:32 Event1_Description
10001A-6456 05.09.2019 12:32 Event1_Description
10001A-6456 09.09.2019 12:40 Event2_Description
10001A-6456 09.09.2019 12:40 Event2_Description
10001A-6456 10.09.2019 12:40 Event3_Description
10001A-6456 10.09.2019 12:40 Event3_Description
20001B-5454 04.09.2019 12:42 Event1_Description
20001B-5454 10.09.2019 12:25 Event2_Description
20001B-5454 11.09.2019 12:25 Event3_Description
20001B-8793 03.09.2019 09:45 Event1_Description
20001B-8793 10.09.2019 12:25 Event2_Description
20001B-8793 11.09.2019 12:25 Event3_Description
20001B-9017 03.09.2019 09:49 Event1_Description
20001B-9017 10.09.2019 12:25 Event2_Description
20001B-9017 11.09.2019 12:25 Event3_Description
</code></pre>