如何解决在 Pandas 中创建新行,通过添加到前一行,循环直到生成 x 行
输入:
mp = [1,2,3,4]
tw = [4,7,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 个列表,然后手动将它们添加到我的数据框中。一定有办法绕过这个,请帮忙!
解决方法
将 df.append
与 df.tail
和 df.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
,
我会为此使用 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,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],4])
.reindex(range(N))
.fillna(1,downcast='infer')
.cumsum())
,
这是一个可自定义的函数,您可以使用它来选择要添加到 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,4]
tw = [4,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,5]
cw = []
df = pd.DataFrame((cw),"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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。