2015-11-05 65 views
0

鑑於以下數據幀:Python的大熊貓:查找匹配和分配更高的價值

import pandas as pd 
DF = pd.DataFrame({'COL1': ['A', 'A', 'B', 'B'], 
        'COL2': [1, 1 ,2 ,2], 
        'COL3': [2, 3, 4, 6]}) 

>>> DF 

    COL1 COL2 COL3 
0 A 1  2 
1 A 1  3 
2 B 2  4 
3 B 2  6 

我想熊貓找到COL1 ==「A」和COL2 == 1和所有出現,當它,使用在第3欄中找到的所有行的更高數量,使得COL3總是3爲A和1

然而,我只希望出現這種情況,如果在值的差僅爲1

因此,對於COL3值,B和2的行保持不變。

期望的結果是這樣的:

COL1 COL2 COL3 
0 A 1  3 
1 A 1  3 
2 B 2  4 
3 B 2  6 

注意:它不會在開始與任何特定的方式進行排序,因該數據幀了。

+1

我認爲這是在你的問題一個錯字,你提到COL3 VAL爲5,而你卻在數據框中粘貼6排3個 –

回答

2
In [71]: 
DF.groupby([DF.COL1 , DF.COL2])['COL3'].transform(lambda x : x.max() if np.abs(x.iloc[1] - x.iloc[0]) == 1 else x) 
Out[71]: 
0 3 
1 3 
2 4 
3 6 
Name: COL3, dtype: int64 
+0

謝謝,納德。如果組中有3行或更多行,我將如何比較COL3中的值?如果數據幀很大並且未排序呢?如何返回數據框? –

+0

實際上你必須定義你需要做什麼,如果你有超過2行,這裏你從第一個減去第二個值,所以如果你有更多的你想做什麼?同樣,如果數據幀沒有排序,我們通過獲取解決方案中已經看到的絕對值來克服這個問題 –

+0

對於組中的n行,我想從COL3的最大值中減去最小值。如果結果的絕對值爲1,則將最大值分配給組的所有n行COL3。否則,什麼也不做。 –

1

由於您剛纔提到了一個特定的條件,因此答案會與您的要求相符合。

import pandas as pd 
import numpy as np 

DF = pd.DataFrame({'COL1': ['A', 'A','B','B'], 'COL2' : [1,1,2,2], 
        'COL3' : [2,3,4,6]}) 

# store max value of COL3 in a variable for condition COL1=A and COL2=1, 
max_val = max((DF[(DF.COL1=='A') & (DF.COL2==1)])['COL3'].values) 
print max_val 

#create function to check for values 
def change_col(column1,column2,column3): 
    if column1=='A' and column2 == 1: 
     out = max_val 
    else: 
     out = column3 
    return out 

#apply function looking at values in all 3 columns 
DF['COL3'] = np.vectorize(change_col)(DF['COL1'],DF['COL2'],DF['COL3']) 
print DF 

結果:

COL1 COL2 COL3 
0 A  1  3 
1 A  1  3 
2 B  2  4 
3 B  2  6