我正在使用 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')
答案 0 :(得分:0)
当您使用 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)