<p>@anky的解决方案很棒;我将推荐一种替代方法,它可以方便地抽象解决方案(特别是对于非唯一索引和空值)</p>
<p>可以使用<a href="https://pyjanitor.readthedocs.io/" rel="nofollow noreferrer">pyjanitor</a>中的<a href="https://pyjanitor.readthedocs.io/reference/janitor.functions/janitor.complete.html#janitor.complete" rel="nofollow noreferrer">complete</a>函数公开显式缺少的值:</p>
<pre><code># pip install janitor
import pandas as pd
import numpy as np
import janitor
In [5]: df.complete(['Person', 'Day'])
Out[5]:
Person Day Value
0 1 Fri 43.0
1 1 Mon 32.0
2 1 Thu 22.0
3 1 Tue 30.0
4 1 Wed 34.0
5 2 Fri 11.0
6 2 Mon 22.0
7 2 Thu NaN
8 2 Tue NaN
9 2 Wed 14.0
10 3 Fri NaN
11 3 Mon NaN
12 3 Thu 23.0
13 3 Tue 13.0
14 3 Wed 22.0
</code></pre>
<p>如果要保持日的顺序,可以将“日”列转换为分类类型:</p>
<pre><code>In [7]: (df.astype({"Day":pd.api.types.CategoricalDtype(categories=df.Day.unique(),
ordered=True)})
.complete(['Person', 'Day']))
Out[7]:
Person Day Value
0 1 Mon 32.0
1 1 Tue 30.0
2 1 Wed 34.0
3 1 Thu 22.0
4 1 Fri 43.0
5 2 Mon 22.0
6 2 Tue NaN
7 2 Wed 14.0
8 2 Thu NaN
9 2 Fri 11.0
10 3 Mon NaN
11 3 Tue 13.0
12 3 Wed 22.0
13 3 Thu 23.0
14 3 Fri NaN
</code></pre>