[英]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,它返回兩個值的平均值。
(此外,如果您將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)
東風:
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.