【问题标题】:How can I add an empty row before a definite row in Python DataFrame?如何在 Python DataFrame 中的确定行之前添加一个空行?
【发布时间】:2021-04-12 16:55:25
【问题描述】:

我在 python 中处理一个巨大的数据框,有时我需要在数据框的确定位置添加一个空行或几行。对于这个问题,我创建了一个小型数据框 df 以显示我想要实现的目标。

cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand', 'Price'])

如果行值为 27000,我想在它之前添加一个空行。 我可以在使用 Concat 之后插入行,但我真的想不出之前添加它的方法..

【问题讨论】:

    标签: python pandas dataframe concatenation


    【解决方案1】:

    您可以为 groupby 创建一个辅助 cumsum 列,然后仅为第一个组附加一个空白行,然后连接:

    out = pd.concat((g.append(pd.Series(),ignore_index=True) if i==0 else g 
           for i, g in df.groupby(df['Price'].eq(27000).cumsum())))
    

    print(out)
    
                Brand    Price
    0     Honda Civic  22000.0
    1  Toyota Corolla  25000.0
    2             NaN      NaN
    2      Ford Focus  27000.0
    3         Audi A4  35000.0
    

    【讨论】:

      【解决方案2】:

      让我们试试cummaxappend

      m = df['Price'].eq(27000).cummax()
      df[~m].append(pd.Series(), ignore_index=True).append(df[m])
      

                  Brand    Price
      0     Honda Civic  22000.0
      1  Toyota Corolla  25000.0
      2             NaN      NaN
      2      Ford Focus  27000.0
      3         Audi A4  35000.0
      

      【讨论】:

        【解决方案3】:

        你也可以通过concat()方法和apply()方法做到这一点:

        result=pd.concat((df.apply(lambda x:np.nan if x['Price']==27000 else x,1),df))
        

        最后使用sort_index()方法,drop_duplicates()方法和reset_index()方法:

        result=result.sort_index(na_position='first').drop_duplicates().reset_index(drop=True)
        

        现在,如果您打印 result,您将获得所需的输出:

            Brand           Price
        0   Honda Civic     22000.0
        1   Toyota Corolla  25000.0
        2   NaN             NaN
        3   Ford Focus      27000.0
        4   Audi A4         35000.0
        

        这将在 Price=27000 的每一行之前添加一个空白行:

        result=pd.concat((df.apply(lambda x:np.nan if x['Price']==27000 else x,1),df))
        
        result=result.drop_duplicates().append(result[result.isna().all(1)].iloc[1:]).sort_index(na_position='first').reset_index(drop=True)
        

        【讨论】:

          【解决方案4】:

          根据您的条件创建一个带有索引标签的 DataFrame,该条件具有所有空值。 [假设df 具有非重复索引]。然后 concat 和 sort_index 将丢失的行放在前面(因为我们将 df 连接到 empty)。然后reset_index 删除重复的索引标签。

          import pandas as pd
          
          empty = pd.DataFrame(columns=df.columns, index=df[df.Price.eq(27000)].index)
          df = pd.concat([empty, df]).sort_index().reset_index(drop=True)
          #            Brand  Price
          #0     Honda Civic  22000
          #1  Toyota Corolla  25000
          #2             NaN    NaN
          #3      Ford Focus  27000
          #4         Audi A4  35000
          

          这将在 27000行之前添加一个空白行

          cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4','Jeep'],
                  'Price': [22000,25000,27000,35000,27000]}
          df = pd.DataFrame(cars, columns = ['Brand', 'Price'])
          
          empty = pd.DataFrame(columns=df.columns, index=df[df.Price.eq(27000)].index)
          df = pd.concat([empty, df]).sort_index().reset_index(drop=True)
          #            Brand  Price
          #0     Honda Civic  22000
          #1  Toyota Corolla  25000
          #2             NaN    NaN
          #3      Ford Focus  27000
          #4         Audi A4  35000
          #5             NaN    NaN
          #6            Jeep  27000
          

          【讨论】:

          • 好一个..!!有远见的(:我不认为价格可以重复:/
          • @anky 是的,我不确定“几行”是指一个位置的几行还是多个位置的几行。 ¯_(ツ)_/¯
          • 实际上说这比我的回答更有意义:)
          猜你喜欢
          • 1970-01-01
          • 2018-08-22
          • 2018-03-02
          • 2018-08-20
          • 2012-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多