Pandas清理列并应用可选的乘数

时间:2013-12-01 14:09:18

标签: python regex pandas

我正在使用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}。我怎样才能摆脱拖尾字符?同时,在......之前或之后......

一种方法将是一种极好的解决方案。

我刚接触正则表达式,所以如果您需要更多信息,请告诉我。

2 个答案:

答案 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替换K000

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