使用from column中的部分字符串来计算并填充pandas dataframe中的另一列

时间:2017-06-02 20:32:45

标签: python pandas dataframe

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

['3m5f Hcap','6f Maiden','7f Hcap','2m6f Stks','3m Hcap']

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

我需要创建一个新列,将各种种族长度转换为表示弗隆总数的整数。

所以上面会是

[29,6,7,20,24]

我甚至不确定从哪一个开始,任何想法都赞赏!

2 个答案:

答案 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