首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在熊猫中设置行范围?

如何在熊猫中设置行范围?
EN

Stack Overflow用户
提问于 2020-12-01 17:25:47
回答 2查看 266关注 0票数 1

我有以下工作代码,在startsends指定的位置将1设置为“ends”。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np


df = pd.DataFrame({"a": np.arange(10)})

starts = [1, 5, 8]
ends = [1, 6, 10]

value = 1
df["new_col"] = 0

for s, e in zip(starts, ends):
    df.loc[s:e, "new_col"] = value

print(df)

a new\_col 0 0 0 1 1 1 2 2 0 3 3 0 4 4 0 5 5 1 6 6 1 7 7 0 8 8 1 9 9 1

我希望这些间隔来自另一个dataframe pointer_df

如何矢量化?

代码语言:javascript
运行
复制
pointer_df = pd.DataFrame({"starts": starts, "ends": ends})

企图:

代码语言:javascript
运行
复制
df.loc[pointer_df["starts"]:pointer_df["ends"], "new_col"] = 2
print(df)

显然不起作用

raise AssertionError("Start slice bound is non-scalar") AssertionError: Start slice bound is non-scalar

编辑:

似乎所有的答案都是用某种琵琶来循环的。

问题是如何将上面的操作矢量化?

如果没有for循环/列表理解,这不是可行的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-01 17:43:00

你可以这样做:

代码语言:javascript
运行
复制
pointer_df = pd.DataFrame({"starts": starts, "ends": ends})

rang = np.arange(len(df))
indices = [i for s, e in pointer_df.to_numpy() for i in rang[slice(s, e + 1, None)]]

df.loc[indices, 'new_col'] = value
print(df)

输出

代码语言:javascript
运行
复制
   a  new_col
0  0        0
1  1        1
2  2        0
3  3        0
4  4        0
5  5        1
6  6        1
7  7        0
8  8        1
9  9        1

如果希望方法不使用任何for循环或列表理解,而只依赖于numpy,则可以:

代码语言:javascript
运行
复制
def indices(start, end, ma=10):
    limits = end + 1
    lens = np.where(limits < ma, limits, end) - start
    np.cumsum(lens, out=lens)
    i = np.ones(lens[-1], dtype=int)
    i[0] = start[0]
    i[lens[:-1]] += start[1:]
    i[lens[:-1]] -= limits[:-1]
    np.cumsum(i, out=i)
    return i


pointer_df = pd.DataFrame({"starts": starts, "ends": ends})
df.loc[indices(pointer_df.starts.values, pointer_df.ends.values, ma=len(df)), "new_col"] = value
print(df)

我从这个answer中的用例中调整了该方法。

票数 1
EN

Stack Overflow用户

发布于 2020-12-01 17:43:13

代码语言:javascript
运行
复制
for i,j in zip(pointer_df["starts"],pointer_df["ends"]):
    print (i,j)

在字典上使用相同的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65095415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档