<p>通过<a href="https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.GroupBy.cumcount.html#pandas-core-groupby-groupby-cumcount" rel="nofollow noreferrer">^{<cd1>}</a>和通过<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.combine_first.html#pandas-series-combine-first" rel="nofollow noreferrer">^{<cd2>}</a>生成NaN填充的伪消息id略有不同的另一个选项:</p>
<pre><code># Create a "message_id"
df['m_id'] = (
df.groupby(['Customer_ID', 'Subject', 'Status']).cumcount()
)
# Create Mask For Delivered Status
m = df.Status.eq('Delivered')
# Merge Delivered and ~Delivered
df = (
df[m].rename(columns={'Date': 'Date Delivered'})
.merge(df[~m].rename(columns={'Date': 'last action date',
'Status': 'Open Status'}),
on=['Customer_ID', 'Subject', 'm_id'],
how='left')
)
# Fill NaN in last action date column
df['last action date'] = (
df['last action date'].combine_first(df['Date Delivered'])
)
</code></pre>
<p><code>df</code>:</p>
<pre><code> Date Delivered Customer_ID Subject Status m_id last action date Open Status
0 1-1-2020 123 How can I Help? Delivered 0 1-1-2020 Opened
1 1-2-2021 100 New Offer Delivered 0 1-2-2021 NaN
2 1-2-2021 100 New Offer Delivered 1 1-2-2021 NaN
3 1-4-2021 144 Last chance, buy now! Delivered 0 2-4-2021 Opened
4 1-4-2021 144 Last chance, buy now! Delivered 1 1-4-2021 NaN
</code></pre>