眼看着@JohnGait和@MaxU提出的方法,我做了一個小速度對比。
arr = np.random.randint(low = 100, size = (10000000, 2))
# using np.where
df = pd.DataFrame(arr, columns = ['a', 'b'])
t_0 = time.time()
df.a, df.b = np.where(df.a > df.b, [df.b, df.a], [df.a, df.b])
t_1 = time.time()
# using df.loc
df = pd.DataFrame(arr, columns = ['a', 'b'])
t_2 = time.time()
cond = df.a > df.b
df.loc[cond, ['a', 'b']] = df.loc[cond, ['b', 'a']].values
t_3 = time.time()
# using df.min
df = pd.DataFrame(arr, columns = ['a', 'b'])
t_4 = time.time()
df['a'], df['b'] = df.min(axis=1), df.max(axis=1)
t_5 = time.time()
# using np.sort
t_6 = time.time()
df_ = pd.DataFrame(np.sort(arr, axis=1), df.index, df.columns)
t_7 = time.time()
t_1 - t_0 # using np.where: 5.759037971496582
t_3 - t_2 # using .loc: 0.12156987190246582
t_5 - t_4 # using df.min: 1.0503261089324951
t_7 - t_6 # 0.20351791381835938
儘管第二種方法是最快的方法,但實際收益並不重要。我出於學究原因在此添加它。我沒有包含排序方法,因爲我相信這會變慢很多。
編輯 我錯誤地報告了np.where
的計算時間,這是由於我犯了一個錯誤。修正了(原來它的最慢很多的!),加上另一個方法(以下@ MaxU的評論)
尼斯比較! +1。你可以爲'pd.DataFrame(np.sort(d.values,axis = 1),d.index,d.columns)'添加時間嗎? – MaxU
@MaxU:補充說,也做了一個更正 –
,因爲我正在處理大型數據集,這非常好! – csbr