计算一个数字在熊猫数据框中出现的次数

时间:2021-04-05 12:56:38

标签: python-3.x pandas

我有一个数据框和一个列表字典。数据框看起来像:

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

我怎样才能做到这一点?将不胜感激。

1 个答案:

答案 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