【问题标题】:Python pandas insert empty rows after each rowPython pandas 在每行之后插入空行
【发布时间】:2021-06-02 13:43:36
【问题描述】:

您好,我正在尝试使用 pandas 在当前数据的每一行之后插入 3 个空行,然后导出数据。例如,当前数据样本可能是:

name     profession
Bill      cashier
Sam        stock
Adam      security

理想情况下我想要达到的目标:

name     profession
Bill      cashier
Nan         Nan
Nan         Nan
Nan         Nan
Sam        stock
Nan         Nan
Nan         Nan
Nan         Nan
Adam      security
Nan         Nan
Nan         Nan
Nan         Nan

我已经尝试过 itertools,但是我不确定如何使用这种方法在每行之后精确地获得三个空行。任何帮助、指导、样品都将不胜感激!

【问题讨论】:

标签: python python-3.x pandas


【解决方案1】:

如果您提供了更多有用的信息,但想到的是使用此命令

df.append(pd.Series(), ignore_index=True)

这将为您的数据框添加一个空行,但正如您所见,您必须传递 set ignore_index=True,否则附加将不起作用。

【讨论】:

    【解决方案2】:

    下面的代码包含一个在数据框的现有行之间添加空行的函数。

    可能不是您想要做的最佳方法,在导出数据时添加空白行可能会更好。

    import pandas as pd
    
    def add_blank_rows(df, no_rows):
        df_new = pd.DataFrame(columns=df.columns)
        for idx in range(len(df)):
            df_new = df_new.append(df.iloc[idx])
            for _ in range(no_rows):
                df_new=df_new.append(pd.Series(), ignore_index=True)
        return df_new
        
    df = pd.read_csv('test.csv')
    
    df_with_blank_rows = add_blank_rows(df, 3)
    
    print(df_with_blank_rows)
    

    【讨论】:

      【解决方案3】:

      这行得通

      df_new = pd.DataFrame()
      for i, row in df.iterrows():
          df_new = df_new.append(row)
          for _ in range(3):
              df_new = df_new.append(pd.Series(), ignore_index=True)
      

      df当然是原来的DataFrame

      【讨论】:

        【解决方案4】:

        这是一个用一个循环来做到这一点的函数:

        def NAN_rows(df):
            row = df.shape[0]
            x = np.empty((3,2,)) # 3 empty row and 2 columns. You can increase according to your original df
            x[:] = np.nan
            df_x = pd.DataFrame( columns = ['name' ,'profession'])
            for i in range(row):
                temp = np.vstack([df.iloc[i].tolist(),x])
                df_x = pd.concat([df_x, pd.DataFrame(temp,columns = ['name' ,'profession'])], axis=0)
                
            return df_x
           
        df = pd.DataFrame({
           'name' : ['Bill','Sam','Adam'],
            'profession' : ['cashier','stock','security']
        })
        
        print(NAN_rows(df))
        
        #Output: 
        
           name profession
        0  Bill    cashier
        1   nan        nan
        2   nan        nan
        3   nan        nan
        0   Sam      stock
        1   nan        nan
        2   nan        nan
        3   nan        nan
        0  Adam   security
        1   nan        nan
        2   nan        nan
        3   nan        nan
        
        

        【讨论】:

          【解决方案5】:

          我认为在数据帧上使用附加是非常低效的(每次都必须为整个数据帧重新分配内存)。

          DataFrames 用于分析数据和轻松添加列,而不是行。

          所以我认为一个好方法是创建一个正确大小的新数据框,然后将数据传输到它。最简单的方法是使用索引。

          # Demonstration data
          data = 'name profession Bill cashier Sam stock Adam security'
          data = np.array(data.split()).reshape((4,2))
          df = pd.DataFrame(data[1:],columns=data[0])
          
          # Add n blank rows
          n = 3
          new_index = pd.RangeIndex(len(df)*(n+1))
          new_df = pd.DataFrame(np.nan, index=new_index, columns=df.columns)
          ids = np.arange(len(df))*(n+1)
          new_df.loc[ids] = df.values
          print(new_df)
          

          输出:

              name profession
          0   Bill    cashier
          1    NaN        NaN
          2    NaN        NaN
          3    NaN        NaN
          4    Sam      stock
          5    NaN        NaN
          6    NaN        NaN
          7    NaN        NaN
          8   Adam   security
          9    NaN        NaN
          10   NaN        NaN
          11   NaN        NaN
          

          【讨论】:

          【解决方案6】:
           # df1 is your original dataframe
           # df2 is the resulting dataframe with empty rows
           # 3 is the amount of rows you want to insert (change to number of rows you need):
          
           df1.index = range(0, 3*len(df1), 3)
           df2 = df1.reindex(index=range(3*len(df1)))
          

          【讨论】:

            猜你喜欢
            • 2018-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-22
            相关资源
            最近更新 更多