【问题标题】:Pandas index error running apply function熊猫索引错误运行应用功能
【发布时间】:2019-12-07 22:35:30
【问题描述】:

我创建了以下函数:

def stripnum(str): 
    array = re.findall(r'\d+', str) 
    return array[0]

在单行上测试这个函数效果很好。

stripnum(dataset.loc[4,'Description']) 
>> 11

现在我想将此函数应用于现有列并创建一个新列:

dataset['Reason'] = dataset['Description'].apply(stripnum)

但不幸的是,我收到了一个错误 list index out of range。 运行dataset.info()我检索到rangeIndex为1366,0到1365的信息。 Description 列有 1366 个元素。所以我很困惑,为什么我会收到这个错误。

我尝试使用以下命令创建一个新的索引列:

dataset['Index'] = range(1,len(dataset)+1) 

但问题仍然存在。

有解决这个问题的聪明方法吗?

【问题讨论】:

  • 如果您拨打stripnum('')stripnum('ABC') 会发生什么?问题出在你的函数上。
  • 如果您只关心第一场比赛,那么使用findall() 有什么意义?
  • 另外,还不清楚你的函数到底是做什么的。你能澄清一下吗?

标签: python pandas indexing apply


【解决方案1】:

除非您确信您传递给函数的列的每一行值都是非空的并且具有数字值,否则您的函数可能存在问题。如果字符串中没有数字并且数组的值是什么,会发生什么? 假设您尝试在字符串值ABC 中使用上述findall

array = re.findall(r'\d+', "ABC") 
array

输出将是[]

如果您尝试访问空数组,则会出错。您可以尝试以下方法:

def stripnum(string_val): 
    array = re.findall(r'\d+', string_val) 
    if array: # <-- Checking if array is not empty
        return array[0]
    else:     # <-- array is empty then return None
        return None

注意:我将str 更改为string_val,因为str 是内置类型名称。

【讨论】:

  • 该死!您当然是对的,因为我只是假设此列中包含一个数字。使用条件语句扩展函数可解决此问题。非常感谢您的帮助!
  • 太棒了! Happy Coding.
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2016-09-23
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多