2017-02-05 60 views
2

我試圖創建一個熊貓數據幀是這樣的:熊貓:創建其交換其他行的值,新列

  x2  x3 
0 3.536220 0.681269 
1 0.681269 3.536220 
2 -0.402380 2.303833 
3 2.303833 -0.402380 
4 2.032329 3.334412 
5 3.334412 2.032329 
6 0.371338 5.879732 
. . . 

所以X2是隨機數列,x3的0行的值並且x2中的1個交換,2和3的值交換,依此類推。我當前的代碼是這樣的:

import numpy as np 
import pandas as pd 
x2 = pd.Series(np.random.normal(loc = 2, scale = 2.5, size = 1000)) 
x3 = pd.Series([x2[i + 1] if i % 2 == 0 else x2[i - 1] for i in range(1000)]) 
df = pd.DataFrame({'x2': x2, 'x3': x3}) 

我不知道是否有任何更快或更優雅的方式,特別是如果我想有許多行(如百萬?),或者重新做一遍又一遍(如蒙特卡洛模擬)?取而代之的

[x2[i + 1] if i % 2 == 0 else x2[i - 1] for i in range(1000)] 

回答

6

你可以使用

def swap(arr): 
    result = np.empty_like(arr) 
    result[::2] = arr[1::2] 
    result[1::2] = arr[::2] 
    return result 

對於長度爲1000的序列,使用swap是超過3000倍快:

In [84]: %timeit [x2[i + 1] if i % 2 == 0 else x2[i - 1] for i in range(1000)] 
100 loops, best of 3: 12.7 ms per loop 

In [98]: %timeit swap(x2.values) 
100000 loops, best of 3: 3.82 µs per loop 

import numpy as np 
import pandas as pd 
np.random.seed(2017) 
x2 = pd.Series(np.random.normal(loc = 2, scale = 2.5, size = 1000)) 
x3 = [x2[i + 1] if i % 2 == 0 else x2[i - 1] for i in range(1000)] 

def swap(arr): 
    result = np.empty_like(arr) 
    result[::2] = arr[1::2] 
    result[1::2] = arr[::2] 
    return result 

df = pd.DataFrame({'x2': x2, 'x3': x3, 'x4': swap(x2.values)}) 
print(df.head()) 

打印

  x2  x3  x4 
0 -0.557363 1.649005 1.649005 
1 1.649005 -0.557363 -0.557363 
2 2.497731 3.433690 3.433690 
3 3.433690 2.497731 2.497731 
4 1.013555 0.679394 0.679394 
相關問題