我有一个数据框和一个列表字典。数据框看起来像:
Name begin stop ID
Peter 30 150 1
Hugo 4500 6000 2
Jennie 300 700 3
字典看起来像:
dictionary = {'0':[30,60,4650],'1':[100,5971]}
我想创建一个新的数据框,在其中遍历字典中的每个列表,并查看值下降的间隔(由开始列和停止列指定)。例如,30、60 和 100 位于第一行,而字典中的 4650 和 5971 位于第二行。但是没有一个值落在第三行。所以我想创建一个新的数据框,以便我也添加计数。所以新的数据框看起来像:
Name begin stop ID count
Peter 30 150 1 3
Hugo 4500 6000 2 2
Jennie 300 700 3 0
我怎样才能做到这一点?将不胜感激。
答案 0 :(得分:2)
df["count"] = df.apply(
lambda x: sum(
x["begin"] <= i <= x["stop"] for v in dictionary.values() for i in v
),
axis=1,
)
print(df)
打印:
Name begin stop ID count
0 Peter 30 150 1 3
1 Hugo 4500 6000 2 2
2 Jennie 300 700 3 0
编辑:使用 bisect
的替代解决方案:
from bisect import bisect_left
dictionary = {"0": [30, 60, 4650], "1": [100, 5971]}
values = sorted([v for lst in dictionary.values() for v in lst])
df["count"] = df.apply(
lambda x: bisect_left(values, x["stop"]) - bisect_left(values, x["begin"]),
axis=1,
)
print(df)
打印:
Name begin stop ID count
0 Peter 30 150 1 3
1 Hugo 4500 6000 2 2
2 Jennie 300 700 3 0