给出以下数据框:
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
注意:它不会以任何特定方式排序,因为此数据框是。
答案 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