<p>您可以通过<a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.mask.html" rel="nofollow noreferrer">^{<cd1>}</a>与<code>.groupby()</code>和<code>.transform()</code>一起执行,如下所示:</p>
<pre><code>df['HeartRateDiff'] = (df['HeartRate'].mask(
df['MonthStart'].groupby([df['Disease'], df['State']]).transform('diff').lt(np.timedelta64(2,'M')),
df.groupby(['Disease', 'State'])['HeartRate'].transform('diff')
)
)
</code></pre>
<hr/>
<h2>详情:</h2>
<p><strong>(1)首先,我们确保日期列采用日期时间格式,而不是字符串:</strong></p>
<p>如果日期列已采用日期时间格式,则可以跳过此步骤</p>
<pre><code>df['MonthStart'] = pd.to_datetime(df['MonthStart'])
df['MonthEnd'] = pd.to_datetime(df['MonthEnd'])
</code></pre>
<p><strong>(2)心率变化(组内)通过以下方式获得:</strong></p>
<pre><code>df.groupby(['Disease', 'State'])['HeartRate'].transform('diff')
</code></pre>
<p>我们可以简单地在<code>.transform()</code>中使用<code>'diff'</code>而不是使用<code>pd.Series.diff</code>来实现相同的结果</p>
<p><strong>(3)通过以下条件检查时间线的连续性(下个月与否):</strong></p>
<pre><code>df['MonthStart'].groupby([df['Disease'], df['State']]).transform('diff').lt(np.timedelta64(2,'M'))
</code></pre>
<p>我们检查与前一日期(组内)的时间差,严格小于2个月,以确保它在下一个月。我们无法检查<;=自连续两个月开始的某个日期差起的1个月可以是32天。请注意,<strong>此检查也适用于年假</strong>(从12月到1月),其中,<strong>仅使用月份数字(从12到1)进行逻辑检查将给出错误的结果</p>
<p><strong>(4)最后,我们在现有列<code>HeartRate</code>上使用<a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.mask.html" rel="nofollow noreferrer">^{<cd1>}</a>得到新列:</strong></p>
<p><a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.mask.html" rel="nofollow noreferrer">^{<cd1>}</a>在其第一个参数中测试条件,并在条件为真时将行替换为其第二个参数中的值。当不满足条件时,它保留行的原始值。因此,实现我们有条件地替代价值观的目标</p>
<p><strong>输出:</strong></p>
<pre><code> Disease HeartRate State MonthStart MonthEnd HeartRateDiff
0 Covid 89 Texas 2020-02-28 2020-03-31 89
1 Covid 91 Texas 2020-03-31 2020-04-30 2
2 Covid 87 Texas 2020-07-31 2020-08-30 87
3 Cancer 90 Texas 2020-02-28 2020-03-31 90
4 Cancer 88 Florida 2020-03-31 2020-04-30 88
5 Covid 89 Florida 2020-02-28 2020-03-31 89
6 Covid 87 Florida 2020-03-31 2020-04-30 -2
7 Flu 90 Florida 2020-02-28 2020-03-31 90
</code></pre>