我有一个相当大的生物信息学数据集,我正在使用 pandas 进行处理。它看起来像这样:
>>> 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
这可行,但对于大型数据集来说非常慢。我的问题是:有没有办法在不使用 iterrows、使用矢量化 Pandas 函数的情况下获得相同的结果,并获得相同的结果?
这应该会更快
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 loop
我是一名优秀的程序员,十分优秀!