Python 使用数据帧循环函数
我有一个函数,它将数据帧和整数作为参数:Python 使用数据帧循环函数,python,pandas,Python,Pandas,我有一个函数,它将数据帧和整数作为参数: func(df, int) 该函数返回一个新的数据帧,例如: df2 = func(df,2) 我想为整数2-10编写一个循环,生成9个数据帧。如果我手动执行此操作,它将如下所示: df2 = func(df,2) df3 = func(df2,3) df4 = func(df3,4) df5 = func(df4,5) df6 = func(df5,6) df7 = func(df6,7) df8 = func(df7,8) df9
func(df, int)
该函数返回一个新的数据帧,例如:
df2 = func(df,2)
我想为整数2-10编写一个循环,生成9个数据帧。如果我手动执行此操作,它将如下所示:
df2 = func(df,2)
df3 = func(df2,3)
df4 = func(df3,4)
df5 = func(df4,5)
df6 = func(df5,6)
df7 = func(df6,7)
df8 = func(df7,8)
df9 = func(df8,9)
df10 = func(df9,10)
有没有一种方法可以编写这样的循环?您可以将
exec
与格式的ted字符串一起使用:
for i in range(2, 11):
exec("df{0} = func(df{1}, {0})".format(i, i - 1 if i > 2 else ''))
您可以将exec
与format
ted字符串一起使用:
for i in range(2, 11):
exec("df{0} = func(df{1}, {0})".format(i, i - 1 if i > 2 else ''))
这种类型的东西就是列表的用途
data_frames = [df]
for i in range(2, 11):
data_frames.append(func(data_frames[-1], i))
当您看到变量名如df1
、df2
、df3
等时,这是代码脆弱的标志。当您要构建一系列相关对象时,请使用列表
为了澄清,此data_frames是一个数据帧列表,可以与data_frames=pd.concat(data_frames,sort=False)连接,从而形成一个数据帧,将原始df与循环产生的所有结果结合在一起,对吗
是的,没错。如果您的目标是最后一个数据帧,则可以在末尾连接整个列表,以将信息合并到单个帧中
你介意解释一下为什么数据帧[-1],作为列表的最后一项,返回一个数据帧吗?我对此不清楚
因为在构建列表时,每个条目始终是一个数据帧<代码>数据帧[-1]
计算为列表中的最后一个元素,在本例中,该元素是您最近添加的数据帧。这种类型的内容就是列表的用途
data_frames = [df]
for i in range(2, 11):
data_frames.append(func(data_frames[-1], i))
当您看到变量名如df1
、df2
、df3
等时,这是代码脆弱的标志。当您要构建一系列相关对象时,请使用列表
为了澄清,此data_frames是一个数据帧列表,可以与data_frames=pd.concat(data_frames,sort=False)连接,从而形成一个数据帧,将原始df与循环产生的所有结果结合在一起,对吗
是的,没错。如果您的目标是最后一个数据帧,则可以在末尾连接整个列表,以将信息合并到单个帧中
你介意解释一下为什么数据帧[-1],作为列表的最后一项,返回一个数据帧吗?我对此不清楚
因为在构建列表时,每个条目始终是一个数据帧<代码>数据帧[-1]计算到列表中的最后一个元素,在本例中,该元素是您最近添加的数据帧。您可以尝试使用
itertools。按如下方式累积
:
样本数据
df:
a b c
0 75 18 17
1 48 56 3
import itertools
def func(x, y):
return x + y
dfs = list(itertools.accumulate([df] + list(range(2, 11)), func))
[ a b c
0 75 18 17
1 48 56 3, a b c
0 77 20 19
1 50 58 5, a b c
0 80 23 22
1 53 61 8, a b c
0 84 27 26
1 57 65 12, a b c
0 89 32 31
1 62 70 17, a b c
0 95 38 37
1 68 76 23, a b c
0 102 45 44
1 75 83 30, a b c
0 110 53 52
1 83 91 38, a b c
0 119 62 61
1 92 100 47, a b c
0 129 72 71
1 102 110 57]
dfs
是结果数据帧的列表,其中每个数据帧是前一个结果的2-10相加
如果希望
concat
将它们全部放在一个数据帧中,请使用pd.concat
pd.concat(dfs)
Out[29]:
a b c
0 75 18 17
1 48 56 3
0 77 20 19
1 50 58 5
0 80 23 22
1 53 61 8
0 84 27 26
1 57 65 12
0 89 32 31
1 62 70 17
0 95 38 37
1 68 76 23
0 102 45 44
1 75 83 30
0 110 53 52
1 83 91 38
0 119 62 61
1 92 100 47
0 129 72 71
1 102 110 57
您可以尝试使用
itertools。按如下方式累积:
样本数据
df:
a b c
0 75 18 17
1 48 56 3
import itertools
def func(x, y):
return x + y
dfs = list(itertools.accumulate([df] + list(range(2, 11)), func))
[ a b c
0 75 18 17
1 48 56 3, a b c
0 77 20 19
1 50 58 5, a b c
0 80 23 22
1 53 61 8, a b c
0 84 27 26
1 57 65 12, a b c
0 89 32 31
1 62 70 17, a b c
0 95 38 37
1 68 76 23, a b c
0 102 45 44
1 75 83 30, a b c
0 110 53 52
1 83 91 38, a b c
0 119 62 61
1 92 100 47, a b c
0 129 72 71
1 102 110 57]
dfs
是结果数据帧的列表,其中每个数据帧是前一个结果的2-10相加
如果希望concat
将它们全部放在一个数据帧中,请使用pd.concat
pd.concat(dfs)
Out[29]:
a b c
0 75 18 17
1 48 56 3
0 77 20 19
1 50 58 5
0 80 23 22
1 53 61 8
0 84 27 26
1 57 65 12
0 89 32 31
1 62 70 17
0 95 38 37
1 68 76 23
0 102 45 44
1 75 83 30
0 110 53 52
1 83 91 38
0 119 62 61
1 92 100 47
0 129 72 71
1 102 110 57
为了澄清,这个data\u frames
是一个数据帧列表,可以与data\u frames=pd.concat(data\u frames,sort=False)
连接,形成一个数据帧,将原始的df
与循环产生的所有结果结合在一起,对吗?请解释一下为什么data\u frames[-1]
,哪个获取列表的最后一项,返回一个数据帧?不清楚。@我在回答中编辑了对您评论的回答。为了澄清,此data\u frames
是可以与data\u frames=pd.concat(data\u frames,sort=False)
连接的数据帧列表,结果是一个数据帧,它将原始的df
与循环产生的所有结果相结合,对吗?您介意解释一下为什么取列表最后一项的data\u frames[-1]
返回一个数据帧吗?我在我的回答中编辑了你评论的答案。