【问题标题】:Loop through several values to fill NaNs in Pandas Dataframe循环遍历几个值以填充 Pandas Dataframe 中的 NaN
【发布时间】:2019-01-15 16:36:07
【问题描述】:

我知道我不能用列表填充 NaN,如 documentation 中的 fillna 所述。那么,使用值列表填充 NaN 的首选方法是什么?期望的行为是遍历列表并一次填充一个 NaN;如果 NaN 比列表中的多,则重新开始。示例:

np.random.seed(0)
s = pd.Series(np.random.randint(0,100, 50))
s.loc[s > 25] = np.nan
s.fillna([10, 20, 30]) # Produces TypeError 

期望的输出:

0   10
1   20
2   30
3   10
4   20
5   9.0
6   30
7   21.0
8   10

等等

这不是内置的,因为它很难矢量化吗?对于它的价值,这只是理论上的,我没有实际数据。

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    使用

    s.loc[s.isna()]=[10,20,30]*(s.isna().sum()//3)+[10,20,30][:s.isna().sum()%3]
    s
    Out[271]: 
    0     10.0
    1     20.0
    2     30.0
    3     10.0
    4     20.0
    5      9.0
    6     30.0
    ...
    

    【讨论】:

      【解决方案2】:

      无需先将值转换为NaN。所以让我们假设这个起点:

      np.random.seed(0)
      s = pd.Series(np.random.randint(0,100, 50))
      

      然后你可以使用locnp.resize

      mask = s > 25
      s.loc[mask] = np.resize([10, 20, 30], mask.sum())
      

      或者,pd.Series.mask:

      s = s.mask(s > 25, np.resize([10, 20, 30], len(s.index)))
      

      结果:

      print(s.head(10))
      # 0    10
      # 1    20
      # 2    30
      # 3    10
      # 4    20
      # 5     9
      # 6    30
      # 7    21
      # 8    10
      # 9    20
      # dtype: int32
      

      【讨论】:

      • 第二个很棒,第一个不适合我 - 保持系列不变
      • @JoshFriedlander,奇怪,你的输入数据对我来说都很好。
      • 好的,我意识到我的错误 - 你的方法在分配 NaN 之前有效。所以应该是mask = np.isnan(s)
      • 除此之外,谢谢!我喜欢它,它比其他选项更惯用。
      • @JoshFriedlander,是的,这里不需要先转换为NaN,这只是一个额外的操作。
      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2015-02-14
      • 2021-05-21
      • 1970-01-01
      • 2015-01-02
      • 2020-02-17
      • 2016-12-03
      • 1970-01-01
      相关资源
      最近更新 更多