【发布时间】:2021-05-09 12:36:43
【问题描述】:
背景
Link 1 表明 apply 可以应用于系列。我想在 DataFrame 的子集上使用 apply 函数,而不需要遍历列。
示例代码
创建大小为 7、7 的示例 DataFrame
def f_test_df(n_rows, n_cols):
df1 = pd.DataFrame(np.random.rand(n_rows, n_cols))
df = df1.applymap(lambda x: round(x*10))
return df
np.random.seed(seed=1)
df1 = f_test_df(7, 7)
如果数字在预定义的范围内,则所需的函数应该返回相同的值,否则根据它是在限制的下限还是上限,应该返回相应的值。要应用的函数如下:
def f_bounds(x, lower, upper):
if x < lower:
return 'lower'
elif x > upper:
return 'upper'
else:
return x
需要应用函数的 DataFrame 的选定部分
df1.loc[2:5, 2:5]
应用函数:
lower = 2
upper = 5
df1.loc[2:5, 2:5].apply(f_bounds, args=(lower, upper))
我遇到了以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
因此,我改变了方法并使用了跨列循环,如下所示(效果很好):
for j in range(2, 5):
print(df1.loc[2:5, j].apply(f_bounds, args=(lower, upper)))
其他未经测试的方法
Link 2 此处参考答案 2,建议不要将 applymap 与参数一起使用。所以,我没有使用applymap,因为该函数需要两个额外的参数。读者请注意,applymap已在答案中使用。
期望的结果
我想实现这个需要争论的功能,而不是将列循环到数据框。
【问题讨论】:
-
你可以试试
df.applymap -
applymap不支持函数所需的参数。因此,我无法使用它。 -
df1.loc[2:5, 2:5].applymap(lambda x: f_bounds(x, lower, upper)) -
谢谢。我不知道此更新。
-
更新了我的答案以展示另一种方法
标签: python pandas arguments apply python-applymap