gpt4 book ai didi

python - 在 Python 中查找最接近的值对并计算平均值

转载 作者:行者123 更新时间:2023-11-28 21:33:14 24 4
gpt4 key购买 nike

我有一个数据框如下:

import pandas as pd
import numpy as np
import random

np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 3)),
columns=list('ABC'),
index=['{}'.format(i) for i in range(100)])

ix = [(row, col) for row in range(df.shape[0]) for col in range(df.shape[1])]
for row, col in random.sample(ix, int(round(.1*len(ix)))):
df.iat[row, col] = np.nan

df = df.mask(np.random.random(df.shape) < .05) #insert 5% of NaNs

df.head()

A B C
0 99 78 61
1 16 73 8
2 62 27 30
3 80 7 76
4 15 53 80

如果我想从列 A、B 和 C 中找到最接近的值对,并计算对值的平均值作为列 D?我怎样才能在 Pandas 中做到这一点?谢谢。

由于我的真实数据有一​​些NaN,如果某些行只有两个值,则将其平均值计算为D列,如果某些行只有一个值,则在D 列中获取该值。

我尝试计算每对的绝对值,从列 diffAB、diffAC 和 diffBC 中找到最小值,然后计算最小对的平均值,但我认为也许有更好的方法.

cols = ['A', 'B', 'C']
df[cols]=df[cols].fillna(0)

df['diffAB'] = (df['A'] - df['B']).abs()
df['diffAC'] = (df['A'] - df['C']).abs()
df['diffBC'] = (df['B'] - df['C']).abs()

更新:

df['Count'] = df[['A', 'B', 'C']].apply(lambda x: sum(x.notnull()), axis=1)

if df['Count'] == 3:
def meanFunc(row):
minDiffPairIndex = np.argmin( [abs(row['A']-row['B']), abs(row['B']-row['C']), abs(row['C']-row['A']) ])
meanDict = {0: np.mean([row['A'], row['B']]), 1: np.mean([row['B'], row['C']]), 2: np.mean([row['C'], row['A']])}
return meanDict[minDiffPairIndex]
if df['Count'] == 2:
...

预期结果:

    A   B   C   D
0 99 78 61 69.5
1 16 73 8 12
2 62 27 30 28.5
3 80 7 76 78
4 15 53 80 66.5

最佳答案

我在这里使用 numpy:

In [11]: x = df.values

In [12]: x.sort()

In [13]: (x[:, 1:] + x[:, :-1])/2
Out[13]:
array([[69.5, 88.5],
[12. , 44.5],
[28.5, 46. ],
[41.5, 78. ],
[34. , 66.5]])

In [14]: np.diff(x)
Out[14]:
array([[17, 21],
[ 8, 57],
[ 3, 32],
[69, 4],
[38, 27]])

In [15]: np.diff(x).argmin(axis=1)
Out[15]: array([0, 0, 0, 1, 1])

In [16]: ((x[:, 1:] + x[:, :-1])/2)[np.arange(len(x)), np.diff(x).argmin(axis=1)]
Out[16]: array([69.5, 12. , 28.5, 78. , 66.5])

In [17]: df["D"] = ((x[:, 1:] + x[:, :-1])/2)[np.arange(len(x)), np.diff(x).argmin(axis=1)]

关于python - 在 Python 中查找最接近的值对并计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54861356/

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