簡體   English   中英

在Pandas中從列值創建排序列表的高效最快方法

[英]Efficient and fastest way in Pandas to create sorted list from column values

給定一個數據框

A B C
3 1 2
2 1 3
3 2 1

我想獲得一個新列,其列名稱按排序順序

A B C new_col
3 1 2 [B,C,A]
2 1 3 [B,A,C]
3 2 1 [C,B,A]

這是我的代碼。 它可以工作,但是很慢。

def blist(x):
    col_dict = {}
    for col in col_list:
        col_dict[col] = x[col]
    sorted_tuple =  sorted(col_dict.items(), key=operator.itemgetter(1))
    return [i[0] for i in sorted_tuple]

df['new_col'] = df.apply(blist,axis=1)

我將贊賞一種解決此問題的更好方法。

嘗試將np.argsort()np.take()結合使用:

In [132]: df['new_col'] = np.take(df.columns, np.argsort(df)).tolist()

In [133]: df
Out[133]:
   A  B  C    new_col
0  3  1  2  [B, C, A]
1  2  1  3  [B, A, C]
2  3  2  1  [C, B, A]

30.000行DF的計時:

In [182]: df = pd.concat([df] * 10**4, ignore_index=True)

In [183]: df.shape
Out[183]: (30000, 3)

In [184]: %timeit df.apply(blist,axis=1)
4.84 s ± 31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [185]: %timeit np.take(df.columns, np.argsort(df)).tolist()
5.45 ms ± 26.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

比:

In [187]: (4.84*1000)/5.45
Out[187]: 888.0733944954128

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM