我正在使用python和pandas。然而,这可能是一个正则表达式问题....警告!
我的数据框类似于以下内容:
21 190000
27 170000
29 120k
31 110K
33 100000s
38 68ks
我希望它看起来像这样:
21 190000
27 170000
29 120000
31 110000
33 100000
38 68000
数据中可能存在一些杂质,例如末尾的尾随字符不是数字或[kK]
(如上所示)。
我可以通过使用\d{3}k
找到其中的一部分但是我不确定如何用'000'替换'k'部分而不影响第一个\d{3}
。我怎样才能摆脱拖尾字符?同时,在......之前或之后......
一种方法将是一种极好的解决方案。
我刚接触正则表达式,所以如果您需要更多信息,请告诉我。
答案 0 :(得分:2)
您不需要为此使用正则表达式,但如果您想:
# i am calling the specific column 'foo'
df = pd.DataFrame( [ '190000', '170000', '120k', '110K', '100000s', '68ks' ],
index=[21, 27, 29, 31, 33, 38], columns=['foo'] )
def clean( x ):
from re import sub
# \g<1> is whatever matches the the first (...)
x = sub( r'(\d+)[kK]', r'\g<1>000', x )
return sub( r'[^\d]', '' , x ) # remove any non-digit character
df.foo.map( clean ).astype( int )
如果您的号码可能有十进制数字,则返回行应更改为
return sub( r'[^\d\.]', '' , x )
你需要施放到浮动:
df.foo.map( clean ).astype( float )
答案 1 :(得分:1)
您可以使用pandas对象上的字符串方法去除s
,并用k
替换K
和000
。
In [6]: df
Out[6]:
1
0
21 190000
27 170000
29 120k
31 110K
33 100000s
38 68ks
In [9]: df[1].str.rstrip('s').str.replace(r'[K|k]', '000').astype(int)
Out[9]:
0
21 190000
27 170000
29 120000
31 110000
33 100000
38 68000
Name: 1, dtype: int64
我在最后将dtype重新设置为int
。