Python pandas.DataFrame:如何使用外部参数应用Map()

Python pandas.DataFrame:如何使用外部参数应用Map(),python,pandas,dataframe,Python,Pandas,Dataframe,有关更清晰的说明,请参见末尾的更新 根据,您可以将外部参数传递给apply函数,但applymap的情况并非如此: 我想应用一个elementwise函数f(a,I),其中a是元素,I是手动输入的参数。我之所以需要它,是因为我将在循环中为某些列表中的I执行df.applymap(f) 举一个我想要的例子,假设我有一个数据帧df,其中每个元素都是一个numpy.ndarray。我想提取每个ndarray的I-th元素,并从中形成一个新的数据帧。所以我定义了我的f: def f(a, i):

有关更清晰的说明,请参见末尾的更新

根据,您可以将外部参数传递给apply函数,但applymap的情况并非如此:

我想应用一个elementwise函数
f(a,I)
,其中
a
是元素,
I
是手动输入的参数。我之所以需要它,是因为我将在循环中为某些列表中的I执行
df.applymap(f)

举一个我想要的例子,假设我有一个数据帧
df
,其中每个元素都是一个
numpy.ndarray
。我想提取每个
ndarray
I
-th元素,并从中形成一个新的数据帧。所以我定义了我的
f

def f(a, i):
    return a[i]
这样我就可以做一个循环,返回
df
中包含的
np.ndarray
中每个元素的第I个元素:

for i in some_series:
    b[i] = df.applymap(f, i=i)
因此,在每次迭代中,它都会将我的
i
值传递给函数
f

我意识到,如果我对
df
使用多索引,一切都会变得更容易,但现在,这就是我正在使用的。有没有办法在熊猫身上做我想做的事?理想情况下,我希望避免遍历
df
中的所有列,我不明白为什么
applymap
不接受关键字参数,而
apply
接受关键字参数

另外,根据我目前对它的理解(可能是错误的),当我使用
df.apply
时,它会给我每行/每列的
I
-th元素,而不是
df
中包含的
I
-th元素


更新:

所以我才意识到我可以将
df
拆分成系列,然后使用
pd.Series.apply
来做我想做的事情。让我生成一些数据来说明我的意思:

def f(a,i):
    return a[i]

b = pd.Series(index=range(10), dtype=object)
for i in b.index:
    b[i] = np.random.rand(5)

b.apply(f,args=(1,))
做的正是我所期望的,也正是我所希望的。但是,尝试使用数据帧:

b = pd.DataFrame(index=range(4), columns=range(4), dtype=object)
for i in b.index:
    for col in b.columns:
        b.loc[i,col] = np.random.rand(10)

b.apply(f,args=(1,))
告诉我
ValueError:传递值的形状是(4,10),索引暗示(4,4)
熊猫不接受参数,
DataFrame.applymap(func)
。如果要将
i
保持为状态,可以将其存储为全局变量,由
func
访问/修改,或使用
装饰器

但是,我建议您尝试这种方法。

您可以使用它:

def matchValue(value, dictionary):
    return dictionary[value]

a = {'first':  1, 'second':  2}
b = {'first': 10, 'second': 20}
df['column'] = df['column'].map(lambda x: matchValue(x, a))

这是一种将参数存储在嵌套方法中的解决方案

f(cell,argument):
    """Do something with cell value and argument"""
    return output

def outer(argument):
   def inner(cell):
        return f(cell,argument)

   return inner 

argument = ...
df.applymap(func = outer(argument))

请参阅更新。有没有办法让apply函数实现我想要的功能?我真的不理解它给我带来的错误(有大量的文本),但我假设它试图返回
b
I
-第行,而不是b的每个元素的
I
-元素。您想在列表或序列上,还是在二维数据帧上使用
f
?熊猫
apply
沿数据帧的输入轴应用函数。和
applymap
将一个函数应用于一个数据帧,该数据帧旨在进行元素操作,例如,为数据帧中的每个系列执行map(func,series)。基本上,我希望applymap的功能(因此在
df
/
b
的每个元素上应用
func
),同时能够传递我的“外部”参数
i
转换为
func
。正如您所说,我似乎可以使用全局变量或函数属性或其他什么,或者只是将
df
拆分为系列,但我只是想知道是否有一种方法可以直接在pandas中实现这一点。这取决于如何定义2D数组的
I-th
元素?如果是<代码> i=行*nCel+Cale/COD>,熊猫没有直接的方式,但是您可以考虑使用<代码>应用< /C> >两次或。