繁体   English   中英

选择三列中最好的

[英]Choose the best of three columns

我有一个包含三列 A、B 和 C 的数据集。 我想创建一个列,其中我 select 两列彼此最接近并取平均值。 以下表为例:

A   B   C   Best of Three
3   2   5   2.5
4   3   1   3.5
1   5   2   1.5

对于第一行,A 和 B 是最接近的对,因此三列中最好的是 (3+2)/2 = 2.5; 对于第三行,A 和 C 是最接近的对,因此三列中的最佳值是 (1+2)/2 = 1.5。 下面是我的代码。 如果有更多的列,它会非常笨重并且很快就会变得太长。 期待建议!

data = {'A':[3,4,1],
        'B':[2,3,5],
        'C':[5,1,2]}
df = pd.DataFrame(data)

df['D'] = abs(df['A'] - df['B'])
df['E'] = abs(df['A'] - df['C'])
df['F'] = abs(df['C'] - df['B'])
df['G'] = min(df['D'], df['E'], df['F'])
if df['G'] = df['D']:
   df['Best of Three'] = (df['A'] + df['B'])/2
elif df['G'] = df['E']:
   df['Best of Three'] = (df['A'] + df['C'])/2
else:
   df['Best of Three'] = (df['B'] + df['C'])/2

首先,您需要一个方法来查找列表中 2 个元素之间的最小差异,该方法还返回具有 2 个值的中位数,这作为元组(diff, median)返回

def min_list(values):
    return min((abs(x - y), (x + y) / 2)
               for i, x in enumerate(values)
               for y in values[i + 1:])

然后在每一行应用它

df = pd.DataFrame([[3, 2, 5, 6], [4, 3, 1, 10], [1, 5, 10, 20]],
                  columns=['A', 'B', 'C', 'D'])

df['best'] = df.apply(lambda x: min_list(x)[1], axis=1)
print(df)

函数是你的朋友。 您想编写一个 function 来查找列表中最接近的两个整数,然后将行的值列表传递给它。 存储这些结果并将它们传递给第二个 function,它返回两个值的平均值。

(此外,如果您将DEFG替换为描述性命名的变量,您的代码将更具可读性。)

使用 itertools 组合生成器解决:

def get_closest_avg(s):
    c = list(itertools.combinations(s, 2))
    return sum(c[pd.Series(c).apply(lambda x: abs(x[0]-x[1])).idxmin()])/2
    
df['B3'] = df.apply(get_closest_avg, axis=1)

东风:

   A  B  C   B3
0  3  2  5  2.5
1  4  3  1  3.5
2  1  5  2  1.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM