<h2>使用<code>dict</code>作为<code>value</code>参数来<code>fillna()</code></h2>
<p>正如@rhkarls在评论@Jeff的答案时提到的,使用索引到列列表的<code>.loc</code>将不支持<code>inplace</code>操作,我也觉得这很令人沮丧。这是一个解决办法。</p>
<p>示例:</p>
<pre><code>import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,2,3,4,np.nan],
'b':[6,7,8,np.nan,np.nan],
'x':[11,12,13,np.nan,np.nan],
'y':[16,np.nan,np.nan,19,np.nan]})
print(df)
# a b x y
#0 1.0 6.0 11.0 16.0
#1 2.0 7.0 12.0 NaN
#2 3.0 8.0 13.0 NaN
#3 4.0 NaN NaN 19.0
#4 NaN NaN NaN NaN
</code></pre>
<p>假设我们想<code>fillna</code>仅用于<code>x</code>和<code>y</code>,<strong>不用于</strong><code>a</code>和<code>b</code>。</p>
<p>我希望使用<code>.loc</code>来工作(如在任务中),但它不是,如前所述:</p>
<pre><code># doesn't work
df.loc[:,['x','y']].fillna(0, inplace=True)
print(df) # nothing changed
</code></pre>
<p>然而,<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html" rel="noreferrer">documentation</a>表示,<code>fillna()</code>的<code>value</code>参数可以是:</p>
<blockquote>
<p>alternately a dict/Series/DataFrame of values specifying which value to use for each index (for a Series) or column (for a DataFrame). (values not in the dict/Series/DataFrame will not be filled).</p>
</blockquote>
<p>事实证明,使用一个dict of values将起作用:</p>
<pre><code># works
df.fillna({'x':0, 'y':0}, inplace=True)
print(df)
# a b x y
#0 1.0 6.0 11.0 16.0
#1 2.0 7.0 12.0 0.0
#2 3.0 8.0 13.0 0.0
#3 4.0 NaN 0.0 19.0
#4 NaN NaN 0.0 0.0
</code></pre>
<p>此外,如果您的子集中有很多列,则可以使用dict理解,如:</p>
<pre><code>df.fillna({x:0 for x in ['x','y']}, inplace=True) # also works
</code></pre>