我有一个'for'循环,它在每次迭代时调用一个函数(y)。该函数返回一个名为phstab的十列数据帧的5列。
for j in cycles
phstab=y(j)
数据框中的最后一列是唯一更改的列。最后一列中的值是循环的值。其他列中的所有其他值在每次迭代时都保持不变。因此,如果循环迭代一段时间,它将产生四个单独的phstab实例;每个实例都有不同的循环值。
我想在每次迭代时附加phstab,所以输出只是一个长数据帧而不是四个实例。我尝试在循环中插入以下语句,但它不起作用
phstab=phstab.append(phstab)
如何获取单个数据帧而不是四个单独的实例?
答案 0 :(得分:0)
我假设你的y(j)返回这样的东西:
In [35]: def y(j):
...: return pd.DataFrame({'a': range(10),
...: 'b': range(10),
...: 'c': range(10),
...: 'd': range(10),
...: 'e_cycle' : j})
要迭代这个函数,为每次迭代添加列,我会做这样的事情。在第一次传递时,数据帧仅设置为phstab。在每次后续迭代中,基于y(j)的结果将新列添加到phstab。
我假设你需要重命名列,如果y(j)根据j的值返回一个唯一的列,你必须修改以适应。
In [38]: cycles = range(5)
In [38]: for i,j in enumerate(cycles):
...: if i == 0:
...: phstab = y(j)
...: phstab = phstab.rename(columns = {'e_cycle' : 'e_' + str(j)})
...: else:
...: phstab['e_' + str(j)] = y(j)['e_cycle']
In [38]: phstab
Out[38]:
a b c d e_0 e_1 e_2 e_3 e_4
0 0 0 0 0 0 1 2 3 4
1 1 1 1 1 0 1 2 3 4
2 2 2 2 2 0 1 2 3 4
3 3 3 3 3 0 1 2 3 4
4 4 4 4 4 0 1 2 3 4
5 5 5 5 5 0 1 2 3 4
6 6 6 6 6 0 1 2 3 4
7 7 7 7 7 0 1 2 3 4
8 8 8 8 8 0 1 2 3 4
9 9 9 9 9 0 1 2 3 4
[10 rows x 9 columns]
编辑: 谢谢你的澄清。要以长格式输出,可以使用pd.concat,如下所示。
In [47]: pd.concat([y(j) for j in cycles], ignore_index=True)
Out[47]:
a b c d e_cycle
0 0 0 0 0 0
1 1 1 1 1 0
2 2 2 2 2 0
3 3 3 3 3 0
4 4 4 4 4 0
5 5 5 5 5 0
6 6 6 6 6 0
7 7 7 7 7 0
8 8 8 8 8 0
9 9 9 9 9 0
10 0 0 0 0 1
11 1 1 1 1 1
.....
[50 rows x 5 columns]
答案 1 :(得分:0)
我相信一个非常简单的解决方案
my_dataframes = []
for j in cycles:
phstab = y(j)
my_dataframes.append(phstab)
full_dataframe = pd.concat(my_dataframes)
或者更简洁(归功于@chrisb)
full_dataframe = pd.concat([y(j) for j in cycles], ignore_index=True)
pd.concat
将数据框列表垂直合并在一起。忽略索引很重要,因此合并后的版本不会保留各个数据帧的索引 - 否则最终会得到索引为[0,1,2,3,0,1,2,3,0,1] ,2,3,0,1,2,3]而你想要[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] 15]。