我将数据框拆分为偶数和赔率,并根据字段按数字顺序排序,如下所示:
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合并数据?我知道可以使用正则表达式,但它会很慢。
答案 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
。