Python有效地将字符串拆分为偶数和奇数两个数据帧

时间:2013-12-08 20:15:35

标签: python sorting split pandas

我将数据框拆分为偶数和赔率,并根据字段按数字顺序排序,如下所示:

import pandas as pd, numpy as np


df = pd.DataFrame({'Type' : ['AA', 'SL', 'BB', 'D0', 'Dk', 'FF'],
                    'ID' : ['100', '15', '20', '25', '37', '32'],
                    'Trans' : ['C', 'C', 'C', 'C', 'N', 'N']}).set_index('Type')

Even=df[df['ID'].astype(float)%2==0].sort(['ID'],ascending=[False])
Odd=df[df['ID'].astype(float)%2==1].sort(['ID'],ascending=[False])

print Even
print Odd

       ID Trans
Type           
FF     32     N
BB     20     C
AA    100     C

[3 rows x 2 columns]
      ID Trans
Type          
Dk    37     N
D0    25     C
SL    15     C

[3 rows x 2 columns]

但是我们可以在'ID'列中说我有一些不能解释为浮点数的字符串,例如:

df = pd.DataFrame({'Type' : ['AA', 'SL', 'BB', 'D0', 'Dk', 'FF'],
                    'ID' : ['100', '15A', '20 D', '25XXX', '37', '32'],
                    'Trans' : ['C', 'C', 'C', 'C', 'N', 'N']}).set_index('Type')

我希望输出为:

       ID Trans
Type           
FF     32     N
BB     20 D   C
AA    100     C

[3 rows x 2 columns]
      ID Trans
Type          
Dk    37     N
D0    25XXX  C
SL    15A    C

[3 rows x 2 columns]

最有效的方法是什么?比如使用df.str.split('FLOATVALUE'[ - 1])然后再按ID合并数据?我知道可以使用正则表达式,但它会很慢。

1 个答案:

答案 0 :(得分:4)

为了获得最佳性能,一项简单的改进只是进行偶数/奇数确定一次。 (上面你做了两次。)

is_even = df['ID'].astype(int) % 2 == 0

even = df[is_even]
odd = df[~is_even]

如果您的ID是可变长度数字后跟可变长度字符串,我不知道如何绕过像regex这样的东西。但是熊猫的矢量化字符串方法非常快。你试过吗?

在当前的开发版本中(现在任何一天以版本0.13发布),您可以使用str.extract

is_even = df['ID'].str.extract('(\d+).*').astype(int) % 2 == 0

在以前的版本中,请查看str.match