我在pandas数据框中有一个列,其中包含如下值:
['3m5f Hcap','6f Maiden','7f Hcap','2m6f Stks','3m Hcap']
这些是指赛马的长度,例如3m5f(3英里和5弗隆)相当于29个弗隆。
我需要创建一个新列,将各种种族长度转换为表示弗隆总数的整数。
所以上面会是
[29,6,7,20,24]
我甚至不确定从哪一个开始,任何想法都赞赏!
答案 0 :(得分:1)
假设您有一个数据框:
df = pd.DataFrame({"dist": ['3m5f Hcap', '6f Maiden', '7f Hcap', '2m6f Stks', '3m Hcap']})
df
# dist
#0 3m5f Hcap
#1 6f Maiden
#2 7f Hcap
#3 2m6f Stks
#4 3m Hcap
您可以extract
里程(假设 m 表示里程)和 furlongs 分开列然后将它们转换为 furlongs :
(df.dist.str.extract("(?:(?P<m>\d+)m)?(?:(?P<f>\d+)f)?", expand=False)
.fillna(0).astype(int).pipe(lambda df: df.m * 8 + df.f))
#0 29
#1 6
#2 7
#3 22
#4 24
#dtype: int64
答案 1 :(得分:0)
我在pandas
中不像@Psidom那样精明,所以这是另一种方式:
def my_func(_data):
val = _data.split(' ')[0]
try:
midx = val.index('m') - 1
except ValueError:
midx = None
try:
fidx = val.index('f') - 1
except ValueError:
fidx = None
m = int(val[midx]) if midx != None else 0
f = int(val[fidx]) if fidx != None else 0
return m * 8 + f
df['furlong'] = df['data'].apply(lambda x: my_func(x))
data furlong
0 3m5f Hcap 29
1 6f Maiden 6
2 7f Hcap 7
3 2m6f Stks 22
4 3m Hcap 24
然后反对他的回答:
time df['furlong'] = df['data'].apply(lambda x: my_func(x))
CPU times: user 679 µs, sys: 123 µs, total: 802 µs
Wall time: 713 µs
def test(df):
return (df.data.str.extract("(?:(?P<m>\d+)m)?(?:(?P<f>\d+)f)?", expand=False).fillna(0).astype(int).pipe(lambda df: df.m * 8 + df.f))
time test(df)
CPU times: user 3.37 ms, sys: 1.01 ms, total: 4.38 ms
Wall time: 3.76 ms