2017-03-09 158 views
3

我有这个数据框。Python - Pandas:如何在数据框的每一行添加一个系列

>>> print(df) 
    a b c d e 
0 z z z z z 
1 z z z z y 
2 z z z x y 
3 z z w x y 
4 z v w x y 

我也有一个系列。

>>> print(map_class) 
    class 
0  -1 
1  0 
2  1 
3  2 
4  3 
5  4 
6  5 
7  6 
8  7 
9  8 
10  9 
11  10 

我的目标是将该系列添加到数据框中的每一行。我期望的输出如下。

>>> print(result) 
    a b c d e class 
0 z z z z z  -1 
1 z z z z z  0 
2 z z z z z  1 
3 z z z z z  2 
4 z z z z z  3 
5 z z z z z  4 
6 z z z z z  5 
7 z z z z z  6 
8 z z z z z  7 
9 z z z z z  8 
10 z z z z z  9 
11 z z z z z  10 
... 
48 z v w x y  -1 
49 z v w x y  0 
50 z v w x y  1 
51 z v w x y  2 
52 z v w x y  3 
53 z v w x y  4 
54 z v w x y  5 
55 z v w x y  6 
56 z v w x y  7 
57 z v w x y  8 
58 z v w x y  9 
59 z v w x y  10 

目前我正在通过使用for循环来做到这一点。但是,表现糟糕。任何其他方式来做到这一点,但不使用for循环?这是我目前的代码。

result = pd.DataFrame() 

for i in range(len(df)): 
    df_temp_multiple = pd.DataFrame() 

    df_temp_single = df.iloc[i] 

    df_temp_multiple = df_temp_multiple.append([df_temp_single]*len(map_class), ignore_index=True) 
    df_temp_multiple = pd.concat([df_temp_multiple, map_class], axis=1) 

    result = pd.concat([result, df_temp_multiple], ignore_index=True) 

我的真实数据集相当大,超过10Gb。因此,性能真的很重要。任何建议将不胜感激。谢谢!

+0

我认为需要'numpy',所以添加标签。 – jezrael

回答

2

下面是利用NumPy的用于从该输出数据在它创建的输出数据和具体地,使用NumPy's advanced-indexing最后构建数据帧的方法 -

m,n,r = df.shape[0], map_class.shape[0], df.shape[1] 

out = np.empty((m,n,r+1),dtype=object) 
out[:,:,:r] = df.values[:,None,:] 
out[:,:,-1] = map_class.values[:,0] 
col_names = list(df.columns) + list(map_class.columns) 
df_out = pd.DataFrame(out.reshape(m*n,-1), columns=col_names) 

运行试验 -

# Loopy version from the question 
In [50]: %timeit func0(df, map_class) 
100 loops, best of 3: 16 ms per loop 

# Proposed one in this post 
In [51]: %timeit func1(df, map_class) 
10000 loops, best of 3: 152 µs per loop 

In [52]: 16000.0/152 
Out[52]: 105.26315789473684 

100x+加速样本数据,并希望应该适合更大的数据集。

+0

谢谢!这是一个很好的解决方案!你也很好地描述了它。再一次,非常感谢! – arnold

相关问题