2014-06-08 109 views
0

我有一个'for'循环,它在每次迭代中调用一个函数(y)。该函数返回一个由10行数据框称为phstab的5列。在熊猫中追加数据帧

for j in cycles 
    phstab=y(j) 

数据框中的最后一列是唯一发生更改的列。最后一列的值是循环的值。其他列中的所有其他值在每次迭代中都保持不变。因此,如果循环迭代时间,例如,它会产生四个单独的phstab实例;每个实例具有不同的周期值。

我想在每次迭代时附加phstab,所以输出只是一个长的数据帧而不是四个实例。我试图在循环中插入以下语句,但它不起作用

phstab=phstab.append(phstab) 

如何获取一个单独的数据框而不是四个单独的实例?

回答

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] 
+0

我一直在寻找40行x 5列作为输出。前10行a列为范围(10),后10列a列也为范围10.只有列e会改变。列e中的前十个值将为零。接下来的十列e列将是一列。 – user3720101

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合并dataframes列表一起垂直。忽略索引是非常重要的,这样合并后的版本不会保留单个数据帧的索引 - 否则您可能会得到索引[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]。