在Pandas中创建新行,方法是添加到前一行,循环直到生成x行



输入:

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个列表,然后手动将它们添加到我的数据帧中。一定有办法解决这个问题,请帮忙!

我会使用numpy,这样我们就可以使用braodcasting执行简单的加法。然后在创建数组之后创建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())

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

这里有一个可自定义的函数,可以用来选择第一行和要添加到panda的行数:

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]
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)

最新更新