<p>我们可以反转列的名称并使用<code>pd.wide_to_long</code>,其中stubnames将是<code>v_j</code>,identifier将是<code>date</code>,我们在结果中将<code>k*</code>称为<code>keys</code>。然后我们可以按<code>keys</code>分组,并使用<code>DataFrame.last_valid_index</code>进行聚合:</p>
<pre><code># reverse the column names
df.columns = df.columns.str.replace(r"(\w+)-(\w+)", r"\2-\1", regex=True)
# wide to long (and then make `keys` a column with reset_index)
long = pd.wide_to_long(df, stubnames=["v1", "v2"], i="date", j="keys",
sep="-", suffix=r"\w+").reset_index("keys")
# get the last valid dates & add a suffix
result = (long.groupby("keys")
.agg(pd.DataFrame.last_valid_index)
.add_suffix("-last"))
</code></pre>
<p>得到</p>
<pre><code>>>> result
v1-last v2-last
keys
k1 2021-05-14 2021-04-30
k1k3 2021-05-14 None
k2 2021-05-31 2021-05-31
k4 2021-04-30 2021-04-10
</code></pre>
<hr/>
<p>要使<code>v_j</code>的存根名称更通用,请执行以下操作:</p>
<pre><code>stubnames = df.columns.str.extract(r"^(\w+)-", expand=False).dropna().unique()
# Index(["v1", "v2"], dtype="object")
</code></pre>