Python Pandas:找到匹配并分配更高的价值

时间:2015-11-05 04:04:01

标签: python pandas dataframe

给出以下数据框:

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

我希望pandas能够找到所有出现的COL1 =='A'和COL2 == 1,当它出现时,使用第3列中找到的所有行的较大数字,使得COL3对于A和​​1总是3。

但是,如果值的差异仅为1,我只希望发生这种情况。

因此,对于COL3值,B和2的行将保持不变。

期望的结果如下所示:

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

注意:它不会以任何特定方式排序,因为此数据框是。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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