首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用矢量化熊猫函数向行添加多个项,而不是迭代?

使用矢量化熊猫函数向行添加多个项,而不是迭代?
EN

Stack Overflow用户
提问于 2014-04-16 18:40:50
回答 1查看 361关注 0票数 2

我有一个相当大的生物信息学数据集,我正在处理使用熊猫。看起来是这样的:

代码语言:javascript
复制
>>> df = pd.DataFrame([['a=1|b=4', 'a=2|b=3', 'a=1|b=1'], 
     [None]*3, [None]*3], index=['metadata', 'a', 'b']).T
>>> df
  metadata     a     b
0  a=1|b=4  None  None
1  a=2|b=3  None  None
2  a=1|b=1  None  None

我想从“元数据”列中提取元数据,并将其放在a列和b列中(是的,生物信息学文件格式非常糟糕)。我目前使用的方法是使用df.iterrows():

代码语言:javascript
复制
>>> def make_dict(string):
        return dict([kv.split('=') for kv in string.split('|')])

>>> for idx, row in df.iterrows():
        for k, v in make_dict(row['metadata']).iteritems():
            df[k][idx] = v

>>> df
  metadata  a  b
0  a=1|b=4  1  4
1  a=2|b=3  2  3
2  a=1|b=1  1  1

这是可行的,但对于大型数据集来说非常慢。我的问题是:是否有一种方法可以获得相同的结果而不使用迭代,使用矢量化的熊猫函数,并得到相同的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 19:03:56

这样应该更快

代码语言:javascript
复制
In [124]: regex = r'\w=(\d+)\|\w=(\d+)'

In [127]: df[['a', 'b']] = df.metadata.str.extract(regex)

In [128]: df
Out[128]: 
  metadata  a  b
0  a=1|b=4  1  4
1  a=2|b=3  2  3
2  a=1|b=1  1  1

[3 rows x 3 columns]

编辑:

有趣,看起来确实慢了点,但我怀疑这会很好的扩展

代码语言:javascript
复制
In [131]: %%timeit
   .....: df[['a', 'b']] = df.metadata.str.extract(regex)
   .....: 
1000 loops, best of 3: 973 µs per loop

In [135]: %%timeit
for idx, row in df.iterrows():
        for k, v in make_dict(row['metadata']).items():
            df[k][idx] = v
   .....: 
1000 loops, best of 3: 440 µs per loop
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23117627

复制
相关文章

相似问题

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