【问题标题】:Missing data, insert rows in Pandas and fill with NAN缺少数据,在 Pandas 中插入行并用 NAN 填充
【发布时间】:2014-11-12 15:15:26
【问题描述】:

我是 Python 和 Pandas 的新手,所以可能有一个我看不到的简单解决方案。

我有一些不连续的数据集,如下所示:

ind A    B  C  
0   0.0  1  3  
1   0.5  4  2  
2   1.0  6  1  
3   3.5  2  0  
4   4.0  4  5  
5   4.5  3  3  

我现在正在寻找一种解决方案来获得以下信息:

ind A    B  C  
0   0.0  1  3  
1   0.5  4  2  
2   1.0  6  1  
3   1.5  NAN NAN  
4   2.0  NAN NAN  
5   2.5  NAN NAN  
6   3.0  NAN NAN  
7   3.5  2  0  
8   4.0  4  5  
9   4.5  3  3  

问题是,A 中的差距在位置和长度上因数据集而异...

【问题讨论】:

  • 欢迎来到stackoverflow。请确保您向其他用户展示您的代码(努力),以便他们能够很好地理解您的问题并进行调试

标签: python numpy pandas


【解决方案1】:

这个问题是很久以前提出的,但我有一个简单的解决方案值得一提。您可以简单地使用 NumPy 的 NaN。例如:

import numpy as np
df[i,j] = np.NaN

会成功的。

【讨论】:

    【解决方案2】:

    使用上面 EdChum 的答案,我创建了以下函数

    def fill_missing_range(df, field, range_from, range_to, range_step=1, fill_with=0):
        return df\
          .merge(how='right', on=field,
                right = pd.DataFrame({field:np.arange(range_from, range_to, range_step)}))\
          .sort_values(by=field).reset_index().fillna(fill_with).drop(['index'], axis=1)
    

    示例用法:

    fill_missing_range(df, 'A', 0.0, 4.5, 0.5, np.nan)
    

    【讨论】:

      【解决方案3】:

      set_indexreset_index 是你的朋友。

      df = DataFrame({"A":[0,0.5,1.0,3.5,4.0,4.5], "B":[1,4,6,2,4,3], "C":[3,2,1,0,5,3]})
      

      首先将 A 列移动到索引中:

      In [64]: df.set_index("A")
      Out[64]: 
           B  C
       A        
      0.0  1  3
      0.5  4  2
      1.0  6  1
      3.5  2  0
      4.0  4  5
      4.5  3  3
      

      然后用新的索引重新索引,这里缺失的数据用nans填充。我们使用Index 对象,因为我们可以命名它;这将在下一步中使用。

      In [66]: new_index = Index(arange(0,5,0.5), name="A")
      In [67]: df.set_index("A").reindex(new_index)
      Out[67]: 
            B   C
      0.0   1   3
      0.5   4   2
      1.0   6   1
      1.5 NaN NaN
      2.0 NaN NaN
      2.5 NaN NaN
      3.0 NaN NaN
      3.5   2   0
      4.0   4   5
      4.5   3   3
      

      最后将索引移回reset_index 的列。由于我们命名了索引,所以一切都很神奇:

      In [69]: df.set_index("A").reindex(new_index).reset_index()
      Out[69]: 
             A   B   C
      0    0.0   1   3
      1    0.5   4   2
      2    1.0   6   1
      3    1.5 NaN NaN
      4    2.0 NaN NaN
      5    2.5 NaN NaN
      6    3.0 NaN NaN
      7    3.5   2   0
      8    4.0   4   5
      9    4.5   3   3
      

      【讨论】:

        【解决方案4】:

        在这种情况下,我将使用新生成的数据框覆盖您的 A 列并将其合并到您的原始 df,然后我使用它:

            In [177]:
        
        df.merge(how='right', on='A', right = pd.DataFrame({'A':np.arange(df.iloc[0]['A'], df.iloc[-1]['A'] + 0.5, 0.5)})).sort(columns='A').reset_index().drop(['index'], axis=1)
        Out[177]:
             A   B   C
        0  0.0   1   3
        1  0.5   4   2
        2  1.0   6   1
        3  1.5 NaN NaN
        4  2.0 NaN NaN
        5  2.5 NaN NaN
        6  3.0 NaN NaN
        7  3.5   2   0
        8  4.0   4   5
        9  4.5   3   3
        

        所以在一般情况下,您可以调整 arange 函数,该函数接受一个开始和结束值,注意我在结束时添加了 0.5,因为范围是打开关闭的,并传递一个步长值。

        更通用的方法可能是这样的:

        In [197]:
        
        df = df.set_index(keys='A', drop=False).reindex(np.arange(df.iloc[0]['A'], df.iloc[-1]['A'] + 0.5, 0.5))
        df.reset_index(inplace=True) 
        df['A'] = df['index']
        df.drop(['A'], axis=1, inplace=True)
        df.reset_index().drop(['level_0'], axis=1)
        Out[197]:
           index   B   C
        0    0.0   1   3
        1    0.5   4   2
        2    1.0   6   1
        3    1.5 NaN NaN
        4    2.0 NaN NaN
        5    2.5 NaN NaN
        6    3.0 NaN NaN
        7    3.5   2   0
        8    4.0   4   5
        9    4.5   3   3
        

        这里我们将索引设置为列A,但不要删除它,然后使用arange 函数重新索引df。

        【讨论】:

          猜你喜欢
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-21
          • 2014-03-15
          • 1970-01-01
          • 2022-11-02
          相关资源
          最近更新 更多