我有一只熊猫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
答案 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}}等与模式不匹配的情况将被忽略。