使用列中字符串的一部分计算并填充datafram中的另一列

2024-06-10 23:51:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pandas数据框中有一列,其中包含如下值:

['3m5f Hcap'、'6f少女'、'7f Hcap'、'2m6f STK'、'3m Hcap']

这些是指赛马的长度,例如3m5f(3英里5弗隆)相当于29弗隆

我需要创建一个新列,该列将各种竞争长度转换为表示furlongs总数的整数

因此,上述内容将是

[29,6,7,20,24]

我甚至不知道从哪里开始这一个,任何想法赞赏


Tags: 数据内容pandas整数总数stk少女hcap
2条回答

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

假设您的数据帧为:

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

您可以将英里(假设m表示英里)和弗隆分别列在不同的列中,然后将它们转换为弗隆

(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

相关问题 更多 >