2015-11-05 62 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