2017-02-05 20 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}) 

も速く以上のエレガントな方法があれば、私は多くの行(例えば100万?)を持っているか(何度も何度もこれを実行したい場合は特に、思ったんだけどモンテカルロシミュレーションなど)?

答えて

6

代わりの

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

あなたは長さ1000のシーケンスのために

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

を使用することができ、swapを使用すると、より高速3000Xの上にある:

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 
関連する問題