gpt4 book ai didi

python - Pandas 根据另一列使用 bins 参数有效地剪切列

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

我有以下 Pandas 数据框:

import numpy as np
import pandas as pd

np.random.seed(0)
test_df = pd.DataFrame({"category": ["A", "B"]*5, "value": np.random.uniform(size=10)})

print(test_df)
# category value
#0 A 0.548814
#1 B 0.715189
#2 A 0.602763
#3 B 0.544883
#4 A 0.423655
#5 B 0.645894
#6 A 0.437587
#7 B 0.891773
#8 A 0.963663
#9 B 0.383442

我想使用 pandas.cutvalue 列装箱,但 bins 参数需要根据 category 列而有所不同。

具体来说,我想使用以下字典来定义要用于cut 的 bin:

bins = {
"A": [0.00, 0.25, 0.50, 0.75, 1],
# 0, 1, 2, 3, 4 <-- corresponding bin value
"B": [0.00, 0.33, 0.66, 1]
# 0, 1, 2, 3 <-- corresponding bin value
}

我想到了以下解决方案,即首先使用所有 bin 切割 value 列:

cuts = {
c: pd.cut(test_df["value"], bins=bins[c], labels=range(1, len(bins[c]))) for c in bins
}

然后使用 numpy.select将适当的 bin 分配回 test_df:

test_df["bin"] = np.select(*zip(*[(test_df["category"] == c, cuts[c]) for c in bins]))
print(test_df)
# category value bin
#0 A 0.548814 3
#1 B 0.715189 3
#2 A 0.602763 3
#3 B 0.544883 2
#4 A 0.423655 2
#5 B 0.645894 2
#6 A 0.437587 2
#7 B 0.891773 3
#8 A 0.963663 4
#9 B 0.383442 2

这是正确的答案,但是有没有更有效的方法呢?理想情况下,应该有一种方法不涉及在每个不同的 bin 上调用 cut。在我的真实世界数据中,我有超过 2 个 bin。

最佳答案

也许将 numpy 与 np.searchsorted 一起使用:

test_df['bin'] = [np.searchsorted(bins[i], v) for i, v in test_df.values]

输出:

  category     value  bin
0 A 0.548814 3
1 B 0.715189 3
2 A 0.602763 3
3 B 0.544883 2
4 A 0.423655 2
5 B 0.645894 2
6 A 0.437587 2
7 B 0.891773 3
8 A 0.963663 4
9 B 0.383442 2

时间

%timeit np.select(zip([(test_df["category"] == c, cuts[c]) for c in bins]))
1.21 ms ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit [np.searchsorted(bins[i], v) for i, v in test_df.values]
301 µs ± 4.14 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - Pandas 根据另一列使用 bins 参数有效地剪切列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57314615/

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