Python 从三列中选择最好的一列

Python 从三列中选择最好的一列,python,pandas,Python,Pandas,我有一个包含三列a、B和C的数据集。我想创建一列,在其中选择彼此最接近的两列并取平均值。以下表为例: 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、B和C的数据集。我想创建一列,在其中选择彼此最接近的两列并取平均值。以下表为例:

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个值的中间值,该值作为元组
(差异,中间值)

然后在每行应用它

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)

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


(此外,如果使用描述性命名变量替换
D
E
F
G
,代码的可读性会更高。)

使用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)
df:

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

当谈到dataframe时,请提供python代码来构建dataframe,以便我们可以复制它并直接运行它。您需要计算三列还是任意数量的列?任意数量的列。谢谢。@azro当我发现在复制示例数据帧后运行
pd.read\u clipboard()
效果非常好时,我非常高兴。可能需要轻微的欺骗才能完全正确。例如,在这种情况下,
pd.read\u剪贴板(r“\s{2,}”)
   A  B  C   B3
0  3  2  5  2.5
1  4  3  1  3.5
2  1  5  2  1.5