<p>由于您不关心使用哪个值,我们可以使用<code>max</code>值:</p>
<pre><code>>>> df['zip'] = df.groupby('location')['zip'].transform(lambda x: x.fillna(x.max())).astype(int)
>>> df
id zip location
0 X2 65123 Houston
1 T5 65123 Houston
2 A1 65123 Houston
3 M8 89517 Berkley
4 X3 89518 Berkley
5 N2 89518 Berkley
</code></pre>
<p>如果需要处理<code>zip</code>和<code>location</code>都是<code>NaN</code>的情况,首先,过滤掉子组:</p>
<pre><code>>>> sub_df = df.loc[df[['zip', 'location']].notna().any(1)]
>>> df
id zip location
0 X2 65123.0 Houston
1 T5 65123.0 Houston
2 A1 NaN Houston
3 M7 NaN NaN # < added a line in between to show index is maintained
4 M8 89517.0 Berkley
5 X3 89518.0 Berkley
6 N2 NaN Berkley
7 M9 NaN NaN
>>> sub_df
id zip location
0 X2 65123.0 Houston
1 T5 65123.0 Houston
2 A1 NaN Houston # < No index 3
4 M8 89517.0 Berkley
5 X3 89518.0 Berkley
6 N2 NaN Berkley
</code></pre>
<p>然后执行相同的操作(只是这次您不需要强制转换为<code>int</code>,因为您的帧中无论如何都会有<code>NaN</code>):</p>
<pre><code>df['zip'] = sub_df.groupby('location')['zip'].transform(lambda x: x.fillna(x.max()))
</code></pre>
<p>结果:</p>
<pre><code> id zip location
0 X2 65123.0 Houston
1 T5 65123.0 Houston
2 A1 65123.0 Houston
3 M7 NaN NaN
4 M8 89517.0 Berkley
5 X3 89518.0 Berkley
6 N2 89518.0 Berkley
7 M9 NaN NaN
</code></pre>