簡體   English   中英

熊貓排序 lambda 函數

[英]pandas sort lambda function

給定一個包含 3 列ABC和 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.

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