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

Python有效地将字符串拆分为偶数和奇数两个数据帧,python,sorting,split,pandas,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',

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

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再次合并数据?我知道可以使用正则表达式,但它会很慢。

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

如果您的ID是可变长度的数字,后跟可变长度的字符串,我不确定您如何处理类似regex的问题。但是熊猫的矢量化字符串方法非常快。你试过了吗

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

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

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

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

如果您的ID是可变长度的数字,后跟可变长度的字符串,我不确定您如何处理类似regex的问题。但是熊猫的矢量化字符串方法非常快。你试过了吗

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

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

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

太棒了!我实际上使用的是12月份版本的pandas 0.13开发版本!为了弄清楚,您使用了什么,然后为数字输入了正则表达式?提取数字。有什么好方法可以在输出的末尾追加字符串吗?(也就是说,对于25XXX,XXX条目应该追加回去)或者字符串应该在以后提取并连接起来吗?Re:您的第一条评论,是的。Re:你的第二条评论,看起来你可以保留原来的ID列——如果你只是想把数字加回去,为什么要放弃它呢?如果这还不能回答你的问题,打开一个单独的问题,显示你想要的输出。太好了!我实际上使用的是12月份版本的pandas 0.13开发版本!为了弄清楚,您使用了什么,然后为数字输入了正则表达式?提取数字。有什么好方法可以在输出的末尾追加字符串吗?(也就是说,对于25XXX,XXX条目应该追加回去)或者字符串应该在以后提取并连接起来吗?Re:您的第一条评论,是的。Re:你的第二条评论,看起来你可以保留原来的ID列——如果你只是想把数字加回去,为什么要放弃它呢?如果这不能回答您的问题,请打开一个单独的问题,显示所需的输出。