如何使用pandas以更优化的方式将str值转换为-int值

时间:2017-10-06 05:38:08

标签: python regex pandas dataframe

我有一个包含这样的值的表,

 a  b
s1  10
s2  12-
s3  13
s4  1-
s5  11

在此表中,val-表示-val,即 12-表示-12

我想转换为此表单

 a  b
s1  10
s2  -12
s3  13
s4  -1
s5  11

如何将此列b转换为整数列。

到目前为止,我试过了,

mask=df['b'].str.endswith('-')
df.loc[mask,'b']=df['b'].str.rstrip('-').astype(int)*(-1)

我可以得到一个必要的结果,但我正热切地寻找是否还有其他最佳解决方案来解决这个问题。

2 个答案:

答案 0 :(得分:3)

首选答案

df.assign(b=df.b.str.replace('(.+)-', r'-\1').astype(int))

    a    b
0  s1   10
1  s2  -12
2  s3   13
3  s4   -1
4  s5   11

尝试快速解答
使用列表理解

df.loc[:, 'b'] = pd.to_numeric(
    [x[-1] + x[:-1] if x.endswith('-') else x for x in df.b.values.tolist()]
)
df

    a    b
0  s1   10
1  s2  -12
2  s3   13
3  s4   -1
4  s5   11

捣乱答案

mask = df.b.str.endswith('-')
df.loc[mask, 'b'] = (lambda s: s.str[-1].str.cat(s.str[:-1]))(df.b[mask])
df.b = df.b.astype(int)
df

    a    b
0  s1   10
1  s2  -12
2  s3   13
3  s4   -1
4  s5   11

答案 1 :(得分:2)

尝试str.replace

b = df.b.str.replace(r'(\d+)-', r'-\1')
print(b)
0     10
1    -12
2     13
3     -1
4     11
Name: b, dtype: object

您将返回结果,如下所示:

df['b'] = b.astype(int) # or .astype(float)

作为piRSquared suggested,您可以以类似的方式使用df.replace,将regex切换为True

df = df.replace(dict(b={'(\d+)-': r'-\1'}), regex=True)
df.b = df.b.astype(float)
print(df)
    a    b
0  s1   10
1  s2  -12
2  s3   13
3  s4   -1
4  s5   11 

谢谢!