在包含字符串的列中转换非数字整数

时间:2014-10-13 15:41:23

标签: python pandas dataframe

我的数据框看起来像下面的垃圾栏:

d = {'Junk Column' : ['1', '2', '3', '4', '5', '6', '7', 'J', 'K'],
 'Good Column' : [1, 2, 3, 4, 5, 6, 7, 'J', 'K']}
df = pd.DataFrame(d)

  Good Column   Junk Column
0   1       1
1   2       2
2   3       3
3   4       4
4   5       5
5   6       6
6   7       7
7   J       J
8   K       K

我的目标是进入Good Column。不同之处在于'1'已转换为1。

df['Junk Column'] = df['Junk Column'].astype(int)

失败,因为'J'和'K'无法转换为整数..

我已成功使用以下方法将垃圾栏转换为好列:

def clean_out_strings(value):
    try:
        return int(value)
    except ValueError:
        return value

df['Junk Column'] = df['Junk Column'].apply(clean_out_strings)

但是,由于我的数据帧大于1mil,并且每天都在增长,因此这很慢。我想看看有人有更快的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

这可能会更快:

>>> df
  good     junk
0    1     1.25  # a float
1    2        2  # already an int
2    3       +3
3    4       -4  # signed
4    5       5   # leading/trailing space
5    6        6
6    7     7   
7    J      J 3
8    K       K5
>>> df['junk'].values
array([1.25, 2, '+3', '-4', ' 5 ', '6', '   7   ', 'J 3', 'K5'], dtype=object)
>>> i = df['junk'].str.strip().str.match(r'[+-]?\d+', na=True)
>>> df.loc[i, 'junk'] = df.loc[i, 'junk'].astype('int')
>>> df['junk'].values
array([1, 2, 3, -4, 5, 6, 7, 'J 3', 'K5'], dtype=object)