gpt4 book ai didi

python - 从多列中查找最接近的值并添加到 Python 中的新列

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:54 25 4
gpt4 key购买 nike

我有以下数据框:

import pandas as pd
import numpy as np
data = {
"index": [1, 2, 3, 4, 5],
"A": [11, 17, 5, 9, 10],
"B": [8, 6, 16, 17, 9],
"C": [10, 17, 12, 13, 15],
"target": [12, 13, 8, 6, 12]
}
df = pd.DataFrame.from_dict(data)
print(df)

我想在 A、B 和 C 列中为目标列找到最接近的值,并将这些值放入列结果中。据我所知,我需要使用 abs() 和 argmin() 函数。这是我预期的输出:

     index   A      B     C    target  result
0 1 11 8 10 12 11
1 2 17 6 17 13 17
2 3 5 16 12 8 5
3 4 9 17 13 6 9
4 5 10 9 15 12 10

这是我从 stackoverflow 找到的解决方案和链接,可能会有帮助:

(df.assign(closest=df.apply(lambda x: x.abs().argmin(), axis='columns'))
.apply(lambda x: x[x['target']], axis='columns'))

Identifying closest value in a column for each filter using Pandas https://codereview.stackexchange.com/questions/204549/lookup-closest-value-in-pandas-dataframe

最佳答案

从其他列中减去“target”,使用idxmin得到最小差值的列,然后进行lookup:

idx = df.drop(['index', 'target'], 1).sub(df.target, axis=0).abs().idxmin(1)
df['result'] = df.lookup(df.index, idx)
df
index A B C target result
0 1 11 8 10 12 11
1 2 17 6 17 13 17
2 3 5 16 12 8 5
3 4 9 17 13 6 9
4 5 10 9 15 12 10

处理字符串列和 NaN 的一般解决方案(以及您将目标中的 NaN 值替换为“v1”中的值的要求):

df2 = df.select_dtypes(include=[np.number])
idx = df2.drop(['index', 'target'], 1).sub(df2.target, axis=0).abs().idxmin(1)
df['result'] = df2.lookup(df2.index, idx.fillna('v1'))

您还可以通过使用 df.columns.get_indexer 获取整数索引来对底层 NumPy 数组进行索引。

# idx = df[['A', 'B', 'C']].sub(df.target, axis=0).abs().idxmin(1)
idx = df.drop(['index', 'target'], 1).sub(df.target, axis=0).abs().idxmin(1)
# df['result'] = df.values[np.arange(len(df)), df.columns.get_indexer(idx)]
df['result'] = df.values[df.index, df.columns.get_indexer(idx)]

df
index A B C target result
0 1 11 8 10 12 11
1 2 17 6 17 13 17
2 3 5 16 12 8 5
3 4 9 17 13 6 9
4 5 10 9 15 12 10

关于python - 从多列中查找最接近的值并添加到 Python 中的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53969800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com