修改函数以评估行上的所有值

时间:2016-12-17 07:33:52

标签: python pandas

测试数据:

import pandas as pd
import numpy as np
from itertools import combinations
df2 = pd.DataFrame(
   {'AAA' : [4,5,6,7,9,10], 'BBB' : [10,20,30,40,11,10],'CCC' : [100,50,25,10,10,11],'DDD' : [100,50,25,10,10,11]});
thresh = 10

我的功能:

def closeCols2(df):
    for k1,k2 in combinations(df.keys(),2):
        if abs(df[k1] - df[k2]) < thresh:
            return max(df[k1],df[k2])

这给了我以下输出,如果两列在thresh中,则显示行的最大值:

df2.apply(closeCols2, axis=1)

0    10
1    50
2    30
3    10
4    11
5    10
dtype: int64

但第1行的DDD列(100)和CCC(100)也有thresh范围内的值,而且这些值未被评估。如何修改我的功能以捕获它?

1 个答案:

答案 0 :(得分:1)

在代码中,函数在找到小于定义的thresh的绝对差值时立即返回。因此第一次在第一行中满足条件的列#AAA;#39; (4)和&#39; BBB&#39; (10)它返回值(10)并停止执行,甚至不评估下一列。我不确切地知道你想做什么,但你可能会尝试像这样调整你的功能。

def closeCols2(df):
    max_value = None
    for k1,k2 in combinations(df.keys(),2):
        if abs(df[k1] - df[k2]) < thresh:
            if max_value is None:
                max_value = max(df[k1],df[k2])
            else:
                # Max of the max
                max_value = max(max_value, max(df[k1],df[k2]))
    return max_value 

df2.apply(closeCols2, axis=1)

# 0    100
# 1     50
# 2     30
# 3     10
# 4     11
# 5     11