[英]pandas sort lambda function
給定一個包含 3 列A
、 B
、 C
和 3 行數值的數據框a
。 如何使用 comp 運算符僅使用A[i]*B[i]
的乘積對所有行進行排序。 似乎熊貓排序只需要列,然后是排序方法。
我想使用如下的比較函數。
f = lambda i,j: a['A'][i]*a['B'][i] < a['A'][j]*a['B'][j]
至少有兩種方式:
方法一
說你開始
In [175]: df = pd.DataFrame({'A': [1, 2], 'B': [1, -1], 'C': [1, 1]})
您可以添加一列作為您的排序鍵
In [176]: df['sort_val'] = df.A * df.B
最后按它排序並刪除它
In [190]: df.sort_values('sort_val').drop('sort_val', 1)
Out[190]:
A B C
1 2 -1 1
0 1 1 1
方法二
使用numpy.argsort
然后在結果索引上使用.ix
:
In [197]: import numpy as np
In [198]: df.ix[np.argsort(df.A * df.B).values]
Out[198]:
A B C
0 1 1 1
1 2 -1 1
另一種方式,在這里添加它,因為這是谷歌的第一個結果:
df.loc[(df.A * df.B).sort_values().index]
這對我來說效果很好,而且非常簡單。 @Ami Tavory 的回答給了我一個帶有分類索引的奇怪結果; 不確定是不是因為這個。
只需添加@srs超級優雅的回答iloc
選項,並與loc
和幼稚的解決方案進行一些時間比較。
(當您的索引基於位置時,iloc 是首選(與基於標簽的 loc 相比)
import numpy as np
import pandas as pd
N = 10000
df = pd.DataFrame({
'A': np.random.randint(low=1, high=N, size=N),
'B': np.random.randint(low=1, high=N, size=N)
})
%%timeit -n 100
df['C'] = df['A'] * df['B']
df.sort_values(by='C')
天真:100 個循環,最好的 3 個:每個循環 1.85 毫秒
%%timeit -n 100
df.loc[(df.A * df.B).sort_values().index]
loc:100 個循環,最好的 3 個:每個循環 2.69 毫秒
%%timeit -n 100
df.iloc[(df.A * df.B).sort_values().index]
iloc:100 個循環,最好的 3 個:每個循環 2.02 毫秒
df['C'] = df['A'] * df['B']
df1 = df.sort_values(by='C')
df2 = df.loc[(df.A * df.B).sort_values().index]
df3 = df.iloc[(df.A * df.B).sort_values().index]
print np.array_equal(df1.index, df2.index)
print np.array_equal(df2.index, df3.index)
所有選項之間的測試結果(比較整個索引順序):
真
真
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.