回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个多索引的数据框:“主题”和“日期时间”。
每一行对应一个主题和一个日期时间,数据框的列对应于各种度量</p>
<p>每个受试者的天数范围各不相同,对于给定的受试者,可能会缺少一些天数(参见示例)。此外,受试者在给定的一天可以有一个或多个值</p>
<p>我想对数据帧重新采样,以便:</p>
<ul>
<li>每个主题每天只有一行(我不关心一天中的时间)</li>
<li>每列值都是当天最后一个非NaN(如果当天没有值,则为NaN)</li>
<li>不创建或保留任何列上没有值的天数</李>
</ul>
<p>例如,以下数据帧示例:</p>
<pre><code> a b
subject datetime
patient1 2018-01-01 00:00:00 2.0 high
2018-01-01 01:00:00 NaN medium
2018-01-01 02:00:00 6.0 NaN
2018-01-01 03:00:00 NaN NaN
2018-01-02 00:00:00 4.3 low
patient2 2018-01-01 00:00:00 NaN medium
2018-01-01 02:00:00 NaN NaN
2018-01-01 03:00:00 5.0 NaN
2018-01-03 00:00:00 9.0 NaN
2018-01-04 02:00:00 NaN NaN
</code></pre>
<p>应返回:</p>
<pre><code> a b
subject datetime
patient1 2018-01-01 00:00:00 6.0 medium
2018-01-02 00:00:00 4.3 low
patient2 2018-01-01 00:00:00 5.0 medium
2018-01-03 00:00:00 9.0 NaN
</code></pre>
<p>我花了太多的时间试图通过使用“pad”选项重新采样来获得这个结果,但我总是得到错误或不是我想要的结果。有人能帮忙吗</p>
<p>注意:以下是创建示例数据帧的代码:</p>
<pre><code>import pandas as pd
import numpy as np
index = pd.MultiIndex.from_product([['patient1', 'patient2'], pd.date_range('20180101', periods=4,
freq='h')])
df = pd.DataFrame({'a': [2, np.nan, 6, np.nan, np.nan, np.nan, np.nan, 5], 'b': ['high', 'medium', np.nan, np.nan, 'medium', 'low', np.nan, np.nan]},
index=index)
df.index.names = ['subject', 'datetime']
df = df.drop(df.index[5])
df.at[('patient2', '2018-01-03 00:00:00'), 'a'] = 9
df.at[('patient2', '2018-01-04 02:00:00'), 'a'] = None
df.at[('patient1', '2018-01-02 00:00:00'), 'a'] = 4.3
df.at[('patient1', '2018-01-02 00:00:00'), 'b'] = 'low'
df = df.sort_index(level=['subject', 'datetime'])
</code></pre>