2017-05-27 96 views
0

我有一個巨大的數據幀(〜10,000,000線),看起來像這樣:熊貓:加快最小值提取

import pandas as pd 
import numpy as np 
col1 = ['A', 'C', 'D', 'D', 'D'] 
col2 = ['B', 'A', 'B', 'C', 'A'] 
col3 = [14, 36, 5, 12, 96] 
df = pd.DataFrame(np.column_stack([col1, col2, col3]), 
        columns=['col1','col2','col3']) 
df['col3'] = df['col3'].astype(int) 


    col1 col2 col3 
0 A B 14 
1 C A 36 
2 D B  5 
3 D C 12 
4 D A 96 

我想找到與每一個獨特的長期(A,B最小值, C,d):

A B 14 
D B 5 
C D 12 
D B 5 

我嘗試以下,但它的速度太慢:

for i in ['A', 'B', 'C', 'D']: 
    dm = df.loc[(df['col1'] == i) | (df['col2'] == i)] 
    print dm.ix[dm['col3'].idxmin()] 

有什麼建議?

回答

5

您可以使用熔體去長表,並使用groupby.min:

pd.melt(df, id_vars=['col3']).groupby('value')['col3'].min() 
Out: 
value 
A 14 
B  5 
C 12 
D  5 
Name: col3, dtype: int64 
+1

@dcirillo如果您對此感到滿意,最好接受答案並回復回答者並表示問題已得到滿意回答 – JohnE

+1

@dcirillo請不要回答這個問題,因爲您說它已經完成你的要求。謝謝你的評論是不允許的,只接受是。我刪除了你的評論。 –

2

您可以找到每個兩列的最小值,然後取最小值:

pd.concat([df.groupby('col1').min(), df.groupby('col2').min()], axis=1)\ 
     .min(axis=1).astype(int) 
#A 14 
#B  5 
#C 12 
#D  5 
2

雖然在我的測試中速度更快,但它在@DYZ的答案中有點類似。如果它被認爲太過衍生而無法作爲單獨的答案發布,我很樂意將其刪除。

df1 = df.groupby('col1')['col3'].min() 
df2 = df.groupby('col2')['col3'].min() 
df1.append(df2).groupby(level=0).min() 

A 14 
B  5 
C 12 
D  5 

我通過簡單地將測試數據擴展到10,240行進行測試。在這種情況下,它比其他建議的解決方案快得多,但比@ ayhan的答案慢了一點(10%),但也許與其他數據相比,它可能會快得多或者比較慢。