Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas:如何使用applymap/apply函数对数据帧进行参数化而不循环 出身背景_Python_Pandas_Arguments_Apply_Python Applymap - Fatal编程技术网

Python Pandas:如何使用applymap/apply函数对数据帧进行参数化而不循环 出身背景

Python Pandas:如何使用applymap/apply函数对数据帧进行参数化而不循环 出身背景,python,pandas,arguments,apply,python-applymap,Python,Pandas,Arguments,Apply,Python Applymap,显示“应用”可应用于系列。我希望在数据帧的子集上使用apply函数,而不在列中循环 示例代码 创建大小为7、7的示例数据帧 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,

显示“应用”可应用于系列。我希望在数据帧的子集上使用apply函数,而不在列中循环

示例代码 创建大小为7、7的示例数据帧

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

应用该函数:

lower = 2
upper = 5
df1.loc[2:5, 2:5].apply(f_bounds, args=(lower, upper))
def f_bounds(x, lower, upper):
    m1 = x < lower
    m2 = x > upper
    
    return np.select([m1, m2], ['lower', 'upper'], default=x)

    
lower = 2
upper = 5
a = pd.DataFrame(f_bounds(df1.loc[2:5, 2:5], 2 ,5),
                 index=df1.index[2:6],
                 columns = df1.columns[2:6])
我遇到了以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
因此,我改变了方法,并使用跨列循环,如下所示(效果很好):

其他未经测试的方法 参考这里的答案2,建议不要使用带参数的
applymap
。因此,我没有使用
applymap
,因为该函数需要另外两个参数。读者请注意,答案中使用了
applymap

预期结果
我想实现这个需要参数的函数,而不需要将列循环到数据帧。

您可以使用
堆栈
取消堆栈

lower = 2
upper = 5
a = df1.loc[2:5, 2:5].stack().apply(f_bounds, args=(lower, upper)).unstack()
print (a)
       2      3      4      5
2      4  upper  lower      2
3  upper  upper  upper  lower
4  lower      4  upper      5
5  upper  lower  upper  upper
或将数据帧传递给函数:

lower = 2
upper = 5
df1.loc[2:5, 2:5].apply(f_bounds, args=(lower, upper))
def f_bounds(x, lower, upper):
    m1 = x < lower
    m2 = x > upper
    
    return np.select([m1, m2], ['lower', 'upper'], default=x)

    
lower = 2
upper = 5
a = pd.DataFrame(f_bounds(df1.loc[2:5, 2:5], 2 ,5),
                 index=df1.index[2:6],
                 columns = df1.columns[2:6])
def_界限(x,下限,上限):
m1=x<更低
m2=x>上部
返回np.select([m1,m2],“下”、“上”],默认值=x)
下限=2
上限=5
a=pd.数据帧(f_界限(df1.loc[2:5,2:5],2,5),
索引=df1。索引[2:6],
columns=df1。columns[2:6])

您可以直接使用
applymap
lambda
函数,该函数接收数据帧窗口上的参数。然后可以直接更新视图以更新原始数据帧-

df1.loc[2:5, 2:5] = df1.loc[2:5, 2:5].applymap(lambda x: f_bounds(x, lower, upper))
print(df1)

编辑:

下面是另一种不用apply或applymap就可以实现的方法

cond1 = df1[(df1.loc[2:5, 2:5]<lower)].notna()
cond2 = df1[(df1.loc[2:5, 2:5]>upper)].notna() 
df1_new = df1.where(~cond1, 'lower').where(~cond2, 'upper')
print(df1_new)

您可能有一个try
df。applymap
applymap
不支持函数所需的参数。因此,我无法使用它。
df1.loc[2:5,2:5].applymap(lambda x:f_界限(x,下,上))
谢谢。我不知道此更新。已更新我的答案,以显示可以执行此操作的其他方法
cond1 = df1[(df1.loc[2:5, 2:5]<lower)].notna()
cond2 = df1[(df1.loc[2:5, 2:5]>upper)].notna() 
df1_new = df1.where(~cond1, 'lower').where(~cond2, 'upper')
print(df1_new)
    0  1      2      3      4      5  6
0   4  7      0      3      1      1  2
1   3  4      5      4      7      2  9
2   0  7      4  upper  lower      2  8
3  10  3  upper  upper  upper  lower  0
4   2  9  lower      4  upper      5  7
5   3  7  upper  lower  upper  upper  7
6   3  8      1      4      9      3  3