我有一个包含这样的值的表,
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)
我可以得到一个必要的结果,但我正热切地寻找是否还有其他最佳解决方案来解决这个问题。
答案 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
谢谢!