【问题标题】:how to fill with 0 in pandas dataframe with fixed index number?如何在具有固定索引号的熊猫数据框中填充 0?
【发布时间】:2019-04-11 09:36:51
【问题描述】:

我想将 CNN 用于某些数据表(数据框或 ndarray) 但我在每个索引中有不同的行数据。

来源:

mIndex  valueA  valueB
------  ------  --------  
  1       111     10      
  1       112     20      
  2       222     30      
  2       221     40      
  2       223     50      
  3       333     60    

希望:(每个索引最多 3 行)

mIndex  valueA  valueB
------  ------  --------  
  1       111     10      
  1       112     20   
  1         0      0
  2       222     30      
  2       221     40      
  2       223     50      
  3       333     60    
  3         0      0
  3         0      0

我想为 CNN 宣传片做这件事。

但是是否可以在 numpy 或 keras pedding 函数中执行此操作?

请帮忙。 提前致谢。

【问题讨论】:

    标签: python pandas numpy keras


    【解决方案1】:

    方法一

    首先应用np.array 获取数组,然后应用pd.Series 基本上将每列的值旋转到一行,这样我们就可以使用堆栈进行转换。 之后我们使用stack 并保留NaN

    最后,我们将concat 的所有数据帧添加到axis=1 上的一个最终数据帧

    cols = ['valueA', 'valueB']
    dfs = []
    for col in cols:
        dfs.append(df.groupby('mIndex')[col].apply(np.array)
                                            .apply(pd.Series)
                                            .stack(dropna=False).reset_index(level=0)
                                                                .rename({0:col}, axis=1))
    
    df_final = pd.concat(dfs, axis=1).reset_index(drop=True)
    
    print(df_final)
       mIndex  valueA  mIndex  valueB
    0       1   111.0       1    10.0
    1       1   112.0       1    20.0
    2       1     NaN       1     NaN
    3       2   222.0       2    30.0
    4       2   221.0       2    40.0
    5       2   223.0       2    50.0
    6       3   333.0       3    60.0
    7       3     NaN       3     NaN
    8       3     NaN       3     NaN
    

    方法二

    我们可以访问groupby 元素

    df= pd.concat([
           d.reset_index(drop=True).reindex(range(3))
           for n, d in df.groupby('mIndex')
    ], ignore_index=True)
    
    print(df)
       mIndex  valueA  valueB
    0     1.0   111.0    10.0
    1     1.0   112.0    20.0
    2     NaN     NaN     NaN
    3     2.0   222.0    30.0
    4     2.0   221.0    40.0
    5     2.0   223.0    50.0
    6     3.0   333.0    60.0
    7     NaN     NaN     NaN
    8     NaN     NaN     NaN
    

    【讨论】:

      【解决方案2】:

      我只能笨拙地做,也许有人有更好的解决方案:

      # df
         mIndex valueA valueB
      0       1      a      a
      1       2      b      b
      2       2      b      b
      3       3      c      c
      

      我们开始吧:

      # get number of required padding
      nPad = df.groupby('mIndex').mIndex.count().transform(lambda x: 3-x)
      
      # get paddings
      pads = []
      for i, row in nPad.items():
          for _ in range(row):
              pads.append([i, 0, 0])
      pads = pd.DataFrame(pads, columns=df.columns)
      
      # padding
      df = pd.concat([df, pads], ignore_index=True)
             .set_index('mIndex').sort_values('mIndex')
      

      填充后:

         mIndex valueA valueB
      1      a      a
      1      0      0
      1      0      0
      2      b      b
      2      b      b
      2      0      0
      3      c      c
      3      0      0
      3      0      0
      

      【讨论】:

      • @Erfan 怎么了?命令?您可以再次使用groupby
      • 添加df = pd.concat([df, pads], ignore_index=True).sort_values('mIndex')
      猜你喜欢
      • 2021-12-30
      • 2018-07-17
      • 2020-11-08
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多