【发布时间】:2013-07-09 18:23:53
【问题描述】:
有没有一种方便的方法可以用数组或列的(第一个)值填充 na 值?
想象一下下面的 DataFrame:
dfcolors = pd.DataFrame({'Colors': ['Blue', 'Red', np.nan, 'Green', np.nan, np.nan, 'Brown']})
Colors
0 Blue
1 Red
2 NaN
3 Green
4 NaN
5 NaN
6 Brown
我想用另一个 DataFrame 或数组中的值填充 NaN 值,所以:
dfalt = pd.DataFrame({'Alt': ['Cyan', 'Pink']})
Alt
0 Cyan
1 Pink
当有更多的 NaN 时,填充值应该保留一些 NaN。并且当有更多的填充值时,并不是所有的都会被使用。所以我们必须做一些计数:
n_missing = len(dfcolors) - dfcolors.count().values[0]
n_fill = min(n_missing, len(dfalt))
数字n_fill是可以填充的值的数量。
选择可以/应该填充的 NaN 值可以通过以下方式完成:
dfcolors.Colors[pd.isnull(dfcolors.Colors)][:n_fill]
2 NaN
4 NaN
Name: Colors, dtype: object
选择填充值
dfalt.Alt[:n_fill]
0 Cyan
1 Pink
Name: Alt, dtype: object
而他们我陷入了这样的困境:
dfcolors.Colors[pd.isnull(dfcolors.Colors)][:n_fill] = dfalt.Alt[:n_fill]
这不起作用...任何提示都会很棒。
这是我想要的输出:
Colors
0 Blue
1 Red
2 Cyan
3 Green
4 Pink
5 NaN
6 Brown
NaN值是从上往下填充的,如果填充值比NaN的多,填充值也是从上往下选择的
【问题讨论】:
-
你想要的输出是什么?
-
好点,我稍微编辑了这个问题。
-
它是returning view vs copy(精美的索引总是返回一个副本)...嗯
-
是的,我认为这是一个主要问题,我尝试了各种方法,例如添加
.values甚至将其包装在新的 DataFrame 中。到目前为止没有运气。