在Pandas中附加数据框

时间:2014-06-08 22:01:17

标签: python pandas

我有一个'for'循环,它在每次迭代时调用一个函数(y)。该函数返回一个名为phstab的十列数据帧的5列。

for j in cycles
    phstab=y(j)

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

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

phstab=phstab.append(phstab)

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

2 个答案:

答案 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]。