仅使用Pandas转换某些行

时间:2018-04-03 03:33:38

标签: python python-3.x python-2.7 pandas dataframe

我有一只熊猫DataFrame。我试图操纵一个列来显示月数。如果记录为01m,则将其设为1.否则,如果它是01y,则按1 x 12进行制作12.但有时我确实有一个名为_variable_value的字段我想要按原样离开。 (忽略)

当前dataframe如下所示:

      institution_short_name            product_name             Term  term
0                        One                Standard       _01y_value  4.85
1                        One                Standard       _02y_value  5.15
2                        One                Standard       _03y_value  5.49
3                        One                Standard       _04y_value  5.89
4                        One                Standard       _05y_value  6.09
5                        One                Standard       _06m_value  4.99
6                        One                Standard       _18m_value  5.15
7                        One                Standard  _variable_value  5.79

我目前收到错误,因为它试图将'va'转换为int,这是不可能的。

df['Time'] = np.where(df['Time'].str.contains("y"), df['Time'].map(lambda x: str(x)[1:3]).astype(int).apply(lambda x: x*12), df['Time'].map(lambda x: str(x)[1:3]).astype(int))

这是我的预期输出:

      institution_short_name            product_name             Term  term
0                        One                Standard               12  4.85
1                        One                Standard               24  5.15
2                        One                Standard               36  5.49
3                        One                Standard               48  5.89
4                        One                Standard               60  6.09
5                        One                Standard                6  4.99
6                        One                Standard               18  5.15
7                        One                Standard  _variable_value  5.79

1 个答案:

答案 0 :(得分:3)

使用str.replace和正则表达式执行此操作的一种方法:

df['Time'] = df.Time.str.replace(
    r"_(\d{2})([ym]).*", 
    lambda m: str(int(m.group(1)) * (12 if m.group(2) == "y" else 1))
)

df

#  institution_short_name product_name             Time  term
#0                    One     Standard               12  4.85
#1                    One     Standard               24  5.15
#2                    One     Standard               36  5.49
#3                    One     Standard               48  5.89
#4                    One     Standard               60  6.09
#5                    One     Standard                6  4.99
#6                    One     Standard               18  5.15
#7                    One     Standard  _variable_value  5.79

_(\d{2})([ym]).*匹配以_ + two digits + y or m开头的字符串,并将数字和单位捕获到两个不同的组中;基于单位,您可以根据需要通过引用lambda函数中的组来修改匹配的数值; <{1}}等与模式不匹配的情况将被忽略。