gpt4 book ai didi

python - 按 pandas 中的值对数据进行分类

转载 作者:太空狗 更新时间:2023-10-30 01:06:34 24 4
gpt4 key购买 nike

我有一个 pandas.DataFrame 的形式

low_bound   high_bound   name
0 10 'a'
10 20 'b'
20 30 'c'
30 40 'd'
40 50 'e'

我有一个很长 pandas.Series 的形式:

value
5.7
30.4
21
35.1

我想为 Series 的每个值赋予其相对于 low_bound/high_bound/name DataFrame 的相应名称。这是我的预期结果:

value         name
5.7 'a'
30.4 'd'
21 'c'
35.1 'd'

确实,5.7 名称是 'a',因为 5.7 被排除在 0 到 10 之间。

什么是最有效的代码?我知道我可以通过遍历系列来解决问题,但也许有一个更快的矢量解决方案正在逃避我。

最后请注意,我的边界可以是自定义的和不规则的。为了示例,这里它们是规则的。

最佳答案

Pandas 有一个叫做 cut 的方法,它会做你想做的事:

import pandas as pd

data = [{"low": 0, "high": 10, "name": "a"},
{"low": 10, "high": 20, "name": "b"},
{"low": 20, "high": 30, "name": "c"},
{"low": 30, "high": 40, "name": "d"},
{"low": 40, "high": 50, "name": "e"},]

myDF = pd.DataFrame(data)

#data to be binned
mySeries = pd.Series([5.7, 30.4, 21, 35.1])

#create bins from original data
bins = list(myDF["high"])
bins.insert(0,0)

print pd.cut(mySeries, bins, labels = myDF["name"])

这将为您提供以下内容,然后您可以将其放回某个数据框中,或者以您想要的方式保存数据:

0    a
1 d
2 c
3 d
dtype: category
Categories (5, object): [a < b < c < d < e]

根据您的容器的不规则程度(以及您所说的自定义/不规则的确切含义),您可能不得不求助于遍历系列。我想不出一个内置函数可以为您处理这个问题,特别是考虑到它取决于 bin 中不规则的程度/类型。

明智地循环,如果您有下限和上限,则此方法将起作用,而不管“规律性”如何:

for el in mySeries:
print myDF["name"][(myDF["low"] < el) & (myDF["high"] > el)]

我明白你可能不想遍历一个巨大的系列,但至少我们没有手动索引数据帧,这可能会使事情变得更慢

关于python - 按 pandas 中的值对数据进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36421849/

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