gpt4 book ai didi

python - 有效地找到多列的低中值

转载 作者:行者123 更新时间:2023-11-28 22:23:54 25 4
gpt4 key购买 nike

我是 Python 的新手,所以我认为这可能是一个基本问题。我在网上找到了一些解决方案,但找不到我正在寻找的确切内容。目前我正在寻找一种方法来找到超过 3 列数据的“低中位数”。如果仅填充 3 列的 2 个值,那么我想取较低的值。

这是我目前的发现

df['median']=np.nanmedian(df[['val1','val2','val3']], axis=1)

以上不是一个可行的解决方案,因为我没有看到任何关于在存在偶数个值时采用低中位数的论据的信息。此外,我发现有一个函数可以满足我的需求

statistics.median_low()

但是,我不确定如何将它应用于多列而不使用某种函数来一次计算每个中值行(即循环或应用函数)。理想情况下,我想要一个使用此函数的矢量化解决方案,它将同时计算中位数。谢谢您的帮助。

最佳答案

使用对每一行进行排序然后根据 NaN 简单地选择第一列或第二列的三列数据几乎没有可能进行优化,由于排序将被推送到每行的末尾。这让我们可以在之后使用切片来进行选择并为每一行获取所需的median_low值。

这里是将它们组装成矢量化解决方案 -

a = df.values
a_sorted = np.sort(a,1)
df['median'] = np.where(np.isnan(a_sorted[:,2]), a_sorted[:,0], a_sorted[:,1])

运行时测试

方法-

# Proposed in this post
def vectorized_app(df):
a = df.values
a_sorted = np.sort(a,1)
df['median'] = np.where(np.isnan(a_sorted[:,2]), a_sorted[:,0], a_sorted[:,1])
return df

# @piRSquared's new soln
def vectorized_app2(df):
v = np.sort(df.values, axis=1)
n = np.count_nonzero(~np.isnan(v), axis=1)
j = (n - 1) // 2
i = np.arange(len(v))
return df.assign(median_low=v[i, j])

# @piRSquared's old soln
from statistics import median_low
def apply_app(df):
med = lambda x: median_low(x.dropna())
return df.apply(med, 1)

时间 -

In [433]: # Setup input dataframe and set one per row as NaN
...: np.random.seed(0)
...: a = np.random.randint(0,9,(10000,3)).astype(float)
...: idx = np.random.randint(0,3,a.shape[0])
...: a[np.arange(a.shape[0]), idx] = np.nan
...: df = pd.DataFrame(a)
...: df.columns = [['val1','val2','val3']]
...:

In [435]: %timeit vectorized_app(df)
1000 loops, best of 3: 481 µs per loop

In [436]: %timeit vectorized_app2(df)
1000 loops, best of 3: 892 µs per loop

In [434]: %timeit apply_app(df)
1 loop, best of 3: 1.15 s per loop

关于python - 有效地找到多列的低中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774399/

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