3

是否有一种方便的方法可以用数组或列的(第一个)值填充 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的多,填充值也是从上到下选择的

4

2 回答 2

3

你可以使用发电机。这样你就可以写这样的东西:

import pandas as pd
from pandas import np

dfcolors = pd.DataFrame({'Colors': ['Blue', 'Red', np.nan, 'Green', np.nan, np.nan, 'Brown']})
dfalt = pd.DataFrame({'Alt': ['Cyan', 'Pink']})

gen_alt = (alt for alt in dfalt.Alt)

for i, color in enumerate(dfcolors.Colors):
    if not pd.isnull(color): continue
    try:
        dfcolors.Colors[i] = gen_alt.next()
    except StopIteration:
        break
print(dfcolors)
#     Colors
# 0   Blue
# 1    Red
# 2   Cyan
# 3  Green
# 4   Pink
# 5    NaN
# 6  Brown
于 2013-07-09T10:23:53.573 回答
3

这是相当糟糕的,但迭代空值的索引是可行的:

In [11]: nulls = dfcolors[pd.isnull(dfcolors['Colors'])]

In [12]: for i, ni in enumerate(nulls.index[:len(dfalt)]):
             dfcolors['Colors'].loc[ni] = dfalt['Alt'].iloc[i]

In [13]: dfcolors
Out[13]:
  Colors
0   Blue
1    Red
2   Cyan
3  Green
4   Pink
5    NaN
6  Brown
于 2013-07-09T10:16:22.447 回答