【问题标题】:Create new rows in Pandas, by adding to previous row, looping until x number of rows are made在 Pandas 中创建新行,通过添加到前一行,循环直到创建 x 行
【发布时间】:2021-04-28 00:23:10
【问题描述】:

输入:

mp = [1,2,3,4]
tw = [4,7,3,5]
cw = []

# create the data frame:

df = pd.DataFrame((cw),
    columns = ["1","2","3","4"])

# add list tw to the first row

df.loc[len(df)] = tw
df

输出:

    1      2      3      4
0   4      7      3      5

期望的输出:

      1      2      3      4
0     4      7      3      5
1     5      8      4      6
2     6      9      5      7
...  ...    ...    ...    ...
3000 3003   3006   3002   3004

从列表“tw”的初始参考行开始,我需要将起始值加 1 并继续。 如何循环并继续创建行,以便下一行是前一行 +1,我需要为 3000 行执行此操作。我见过的很多解决方案都需要我创建列表并添加到 pandas 数据框中,但是我无法手动创建 3000 个列表,然后手动将它们添加到我的数据框中。一定有办法绕过这个,请帮忙!

【问题讨论】:

    标签: python pandas dataframe loops iteration


    【解决方案1】:

    我会为此使用 numpy,这样我们就可以通过广播执行简单的加法。然后在创建数组后创建 DataFrame。逐行增长 DataFrame 效率极低。

    import pandas as pd
    import numpy as np
    
    N = 3000           # Number of rows
    tw = [4, 7, 3, 5]  # Initial column values
    
    df = pd.DataFrame(np.array(tw) + np.arange(N)[:, None],
                      columns=[1,2,3,4])
    #         1     2     3     4
    #0        4     7     3     5
    #1        5     8     4     6
    #2        6     9     5     7
    #...    ...   ...   ...   ...
    #2997  3001  3004  3000  3002
    #2998  3002  3005  3001  3003
    #2999  3003  3006  3002  3004
    # 
    #[3000 rows x 4 columns]
    

    另一种选择是创建单行 DataFrame,reindex 来创建所有行,填写您要添加的值 (1) 和 cumsum

    df = (pd.DataFrame([tw], columns=[1,2,3,4])
            .reindex(range(N))
            .fillna(1, downcast='infer')
            .cumsum())
    

    【讨论】:

      【解决方案2】:

      df.appenddf.taildf.add 一起使用:

      n = 3000 # this is the value of total rows you want
      
      In [209]: for i in range(n):
           ...:     df = df.append(df.tail(1).add(1))
           ...: 
      

      示例:

      In [214]: df
      Out[214]: 
         1  2  3  4
      0  4  7  3  5
      
      In [215]: n = 5
      
      In [216]: for i in range(5):
           ...:     df = df.append(df.tail(1).add(1))
           ...: 
      
      In [217]: df
      Out[217]: 
         1   2  3   4
      0  4   7  3   5
      0  5   8  4   6
      0  6   9  5   7
      0  7  10  6   8
      0  8  11  7   9
      0  9  12  8  10
      

      【讨论】:

        【解决方案3】:

        这是一个可自定义的函数,您可以使用它来选择第一行以及要添加到熊猫的行数:

        import pandas as pd
        def expandingRow(df, firstRow, nRows):
            for i in range (0,nRows):
               df.loc[len(df)] = [x+len(df.index) for x in firstRow]
        
        mp = [1,2,3,4]
        tw = [4,7,3,5]
        cw = []
        
        # create the data frame:
        
        df = pd.DataFrame((cw),
            columns = ["1","2","3","4"])
        
        expandingRow(df, tw, 3000)
        df
        Out[1]: 
                 1     2     3     4
        0        4     7     3     5
        1        5     8     4     6
        2        6     9     5     7
        3        7    10     6     8
        4        8    11     7     9
           ...   ...   ...   ...
        2995  2999  3002  2998  3000
        2996  3000  3003  2999  3001
        2997  3001  3004  3000  3002
        2998  3002  3005  3001  3003
        2999  3003  3006  3002  3004
        
        [3000 rows x 4 columns]
        

        【讨论】:

          【解决方案4】:
          tw = [4,7,3,5]
          
          cw = []
          df = pd.DataFrame((cw),
              columns = ["1","2","3","4"])
          df.loc[len(df)] = tw
          df.reset_index()
          
          for key in range(2999):
              row = df.loc[key].values #convert to array
              row = row.tolist() #convert to nested list
              row=[x+1 for x in row]
              df.loc[key+1]=row
              print (row)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-22
            • 2019-03-09
            • 2020-01-07
            • 1970-01-01
            • 1970-01-01
            • 2012-01-29
            相关资源
            最近更新 更多