【问题标题】:Inserting blank row pandas dataframe插入空白行熊猫数据框
【发布时间】:2019-05-01 12:08:48
【问题描述】:

我有一个名为“因子”的列,每次该列中的名称发生变化时,我想插入一个空白行,这可能吗?

for i in range(0, end):
    if df2.at[i + 1, 'factor'] != df2.at[i, 'factor']:

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用 Float64Indexreindex 边缘 indices 添加到 0.5union 的原始索引。

    df2 = pd.DataFrame({'factor':list('aaabbccdd')})
    
    idx = df2.index.union(df2.index[df2['factor'].shift(-1).ne(df2['factor'])] + .5)[:-1]
    print (idx)
    Float64Index([0.0, 1.0, 2.0, 2.5, 3.0, 4.0, 4.5, 5.0, 6.0, 6.5, 7.0, 8.0], dtype='float64')
    
    df2 = df2.reindex(idx, fill_value='').reset_index(drop=True)
    print (df2)
       factor
    0       a
    1       a
    2       a
    3        
    4       b
    5       b
    6        
    7       c
    8       c
    9        
    10      d
    11      d
    

    如果想要缺失值:

    df2 = df2.reindex(idx).reset_index(drop=True)
    print (df2)
       factor
    0       a
    1       a
    2       a
    3     NaN
    4       b
    5       b
    6     NaN
    7       c
    8       c
    9     NaN
    10      d
    11      d
    

    【讨论】:

      【解决方案2】:

      for 循环中手动顺序插入行效率低下。作为替代方案,您可以找到发生变化的索引,构造一个新的数据框,连接,然后按索引排序:

      df = pd.DataFrame([[1, 1], [2, 1], [3, 2], [4, 2],
                         [5, 2], [6, 3]], columns=['A', 'B'])
      
      switches = df['B'].ne(df['B'].shift(-1))
      idx = switches[switches].index
      
      df_new = pd.DataFrame(index=idx + 0.5)
      df = pd.concat([df, df_new]).sort_index()
      
      print(df)
      
             A    B
      0.0  1.0  1.0
      1.0  2.0  1.0
      1.5  NaN  NaN
      2.0  3.0  2.0
      3.0  4.0  2.0
      4.0  5.0  2.0
      4.5  NaN  NaN
      5.0  6.0  3.0
      5.5  NaN  NaN
      

      如果需要,可以使用reset_index来规范化索引:

      print(df.reset_index(drop=True))
      
           A    B
      0  1.0  1.0
      1  2.0  1.0
      2  NaN  NaN
      3  3.0  2.0
      4  4.0  2.0
      5  5.0  2.0
      6  NaN  NaN
      7  6.0  3.0
      8  NaN  NaN
      

      【讨论】:

        猜你喜欢
        • 2016-12-31
        • 2021-10-06
        • 2019-01-25
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多