首页 > 解决方案 > pandas apply typeError: 'float' object is not subscriptable, 在 pandas 的特定列上应用自定义函数

问题描述

我正在使用 lambda 函数基于自定义函数创建一个新的数据框列,但我无法让它工作。我在下面发布了代码和错误,看起来问题不在于 lambda 函数,而在于原始自定义函数 (get_bins)。

df['X'] 中的值是浮点值,但 get_bin 函数在应用于 lambda 函数之外时有效。不知道我要去哪里错了。

def get_bins(df):
    interval_range = pd.interval_range(start = min(df), end = max(df) + 5, freq=5, closed = 'left')
    bins = pd.cut(df,interval_range)
    return (bins)


df_ex['bins'] = df_ex.apply(lambda i: get_bins(i['X']), axis = 1)

 
---> 10 df['bins'] = df.apply(lambda i: get_bins(i['X']), axis = 1)

<ipython-input-7-7bbf11fd23d3> in get_bins(d)
      2 
      3 def get_bins(d):
----> 4     interval_range = pd.intervalpandas apply typeError: 'float' object is not subscriptable_range(start = min(d), end = max(d) + 5, freq=5, closed = 'left')
      5     bins = pd.cut(d,interval_range)
      6     return (bins)

TypeError: ("'float' object is not iterable", 'occurred at index 0')

标签: pythondataframelambdatypeerrorapply

解决方案


当您使用 df.apply(..., axis=1) 时,您将自定义函数应用于整行。然后将该行转换为系列(如果您愿意,可以将初始行的转置矩阵)。

当您使用“lambda i: get_bins(i['X'])”时,您将唯一的 row['X'] 值传递给 get_bins 函数。row['X'] 作为浮点数,python 无法计算最小值或最大值。

注意:如果你想更好地理解,你可以这样做:

def my_print(x):
  print(x)
  print('-'*50)
df.apply(my_print, axis=1)

推荐阅读