首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >范围(列表)为虚拟列

范围(列表)为虚拟列
EN

Stack Overflow用户
提问于 2018-11-23 11:13:08
回答 1查看 70关注 0票数 4

我有两个列的开始和结束范围。我想为这个列之间的范围制作虚拟列。我可以用应用的方法制作它,但是它很慢。我不需要申请就能成功(因为我有2-5米行)。

整个DataFrame:

代码语言:javascript
运行
复制
    start     end
0   36        36
1   31        31
2   29        29
3   10        10
4   35        35
5   42        44
6   24        26

我想看到的是:

代码语言:javascript
运行
复制
    start   end 8   9   10  24  25  26  29  31  35  36  42  43  44
0   36      36  NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN
1   31      31  NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN
2   29      29  NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN
3   10      10  NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4   35      35  NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN
5   42      44  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0
6   24      26  NaN NaN NaN 1.0 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN
7   25      25  NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN
8   35      35  NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN
9   8       10  1.0 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

现在我使用以下代码:

代码语言:javascript
运行
复制
import itertools

def zip_with_scalar(l, o):
    return dict(zip(l, itertools.repeat(o)))
df.merge(df.apply(lambda s: pd.Series(zip_with_scalar(range(s['start'], s['end']+1), 1)), axis = 1), left_index=True, right_index=True)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-23 11:32:45

将列表理解与DataFrame构造函数一起使用:

代码语言:javascript
运行
复制
a = [dict.fromkeys(range(x, y), 1) for x, y in zip(df['start'], df['end']+1)]
df = df.join(pd.DataFrame(a, index=df.index))
print (df)
   start  end   10   24   25   26   29   31   35   36   42   43   44
0     36   36  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  NaN  NaN  NaN
1     31   31  NaN  NaN  NaN  NaN  NaN  1.0  NaN  NaN  NaN  NaN  NaN
2     29   29  NaN  NaN  NaN  NaN  1.0  NaN  NaN  NaN  NaN  NaN  NaN
3     10   10  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
4     35   35  NaN  NaN  NaN  NaN  NaN  NaN  1.0  NaN  NaN  NaN  NaN
5     42   44  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0  1.0
6     24   26  NaN  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN

性能

代码语言:javascript
运行
复制
#[70000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)

def a(df):
    a = [dict.fromkeys(range(x, y), 1) for x, y in zip(df['start'], df['end']+1)]
    return df.join(pd.DataFrame(a, index=df.index))

import itertools

def zip_with_scalar(l, o):
    return dict(zip(l, itertools.repeat(o)))
def b(df):
    return df.merge(df.apply(lambda s: pd.Series(zip_with_scalar(range(s['start'], s['end']+1), 1)), axis = 1), left_index=True, right_index=True)


In [176]: %timeit a(df.copy())
202 ms ± 6.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [177]: %timeit b(df.copy())
38.9 s ± 1.19 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53445635

复制
相关文章

相似问题

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