【问题标题】:Pandas fillna with list/array带有列表/数组的熊猫填充
【发布时间】: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 中。到目前为止没有运气。

标签: python pandas


【解决方案1】:

这很糟糕,但是遍历空值的索引是可行的:

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

【讨论】:

    【解决方案2】:

    您可以使用生成器。这样你就可以这样写:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2020-06-15
      • 2021-09-14
      • 2022-10-13
      • 2021-10-04
      相关资源
      最近更新 更多