【问题标题】:Converting non-numeric integers in column that also contains strings在还包含字符串的列中转换非数字整数
【发布时间】:2014-10-13 15:41:22
【问题描述】:

我有一个看起来像下面的垃圾列的数据框:

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)

但是,由于我的数据框超过 100 万行,并且每天都在增长,所以这非常慢。我想看看是否有人有更快的方法来做到这一点。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这可能会更快:

    >>> 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)
    

    【讨论】:

    • 我敢打赌这会更快。但是,当我使用它时, i.unique() 会导致 array([nan, False], dtype=object) 然后抛出 ValueError: cannot index with vector contains NA / NaN values in the df.loc[] line
    • @DataSwede 这意味着您混合了非字符串值;您需要根据这些值指定na=Truena=False。查看我的编辑。
    猜你喜欢
    • 2018-09-24
    • 2023-03-31
    • 2010-11-22
    • 2013-11-12
    • 2018-01-18
    • 2020-08-05
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多