我有一个相当大的生物信息学数据集,我正在处理使用熊猫。看起来是这样的:
>>> 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():
>>> 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这是可行的,但对于大型数据集来说非常慢。我的问题是:是否有一种方法可以获得相同的结果而不使用迭代,使用矢量化的熊猫函数,并得到相同的结果?
发布于 2014-04-16 19:03:56
这样应该更快
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]编辑:
有趣,看起来确实慢了点,但我怀疑这会很好的扩展
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 loophttps://stackoverflow.com/questions/23117627
复制相似问题