Python pandas.DataFrame:如何使用外部参数应用Map()
有关更清晰的说明,请参见末尾的更新 根据,您可以将外部参数传递给apply函数,但applymap的情况并非如此: 我想应用一个elementwise函数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):
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> >两次或。