0

这是我之前发布的一个问题的扩展:Python Sum lookup dynamic array table with df column

我目前正在研究一种有效地将决策变量映射到数据框的方法。主 DF 和查找表的长度将是动态的(分别为 +15,000 行和 +20 行)。因此希望不要循环执行此操作,但很高兴听到建议。

DF (DF1) 大致如下所示,我想在其中查找/搜索决策。

在单独的 DF (DF0) 上找到决策值。

例如:第一个 DF1["ValuesWhereXYcomefrom"] 值为 6.915,在键表上介于 3.8>=(value)>7.4 之间,因此对应的值 DF0["Decision"] 为 -1。然后重复该过程,直到每一行都映射到一个决策。

我正在考虑使用 python bisect 库,但还没有采用任何可行的解决方案并且还使用循环。现在我想知道我是否在错误地看待问题,因为映射和循环 15k 行非常耗时。

示例主要数据 (DF1):

时间 值0 价值1 价值2 XY 来自哪里的价值观 Value_toSum 决策图
1 41.43 6.579482077 0.00531021
2 41.650002 6.756817908 46.72466411 6.915187703 0.001200456 -1
3 41.700001 6.221966706 11.64727001 1.871959552 0.000959257 -1
4 41.740002 6.230847055 46.92753343 7.531485368 0.006228989 1
5 42 6.637399856 8.031374656 1.210018204 0.010238095 -1
6 42.43 7.484894608 16.24547568 2.170434793 -0.007777563 -1
7 42.099998 7.595291765 38.73871244 5.100358702 0.003562993 -1
8 42.25 7.567457423 37.07538953 4.899319211 0.01088755 -1
9 42.709999 8.234795546 64.27986403 7.805884636 0.005151042 1
10 42.93 8.369526407 24.72700129 2.954408659 -0.003028209 -1
11 42.799999 8.146653099 61.52243361 7.55186613 0 1

示例键表 (DF0):

价值X 价值Y 决定
0.203627201 3.803627201 0.040294925 -1
3.803627201 7.403627201 0.031630668 -1
7.403627201 11.0036272 0.011841521 1
4

1 回答 1

0

假设您的第一个 DataFrame 被调用df并且您的第二个是decision

def map_func(x):
    for i in range(len(decision)):
        try:
            if x < decision["ValueY"].iloc[i]:
                return decision["Decision"].iloc[i]
        except Exception:
            return np.nan
df["decision"] = df["ValuesWhereXYcomefrom"].apply(lambda x: map_func(x))

这将在您的 DataFrame 中创建一个名为“decision”的新行,其中包含查找的值。然后,您可以查询它:

df.decision.iloc[row]
于 2021-04-05T07:14:00.580 回答