pandas.DataFrame:如何使用外部参数applymap()

时间:2017-02-15 21:47:56

标签: python pandas dataframe

在最后看到更新更清晰的说明。

根据http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.apply.html,您可以将外部参数传递给apply函数,但applymap也是如此:http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.applymap.html#pandas.DataFrame.applymap

我想应用元素函数f(a, i),其中a是元素,i是手动输入的参数。我需要的原因是因为我会在循环df.applymap(f)for i in some_list

举一个我想要的例子,说我有一个DataFrame df,其中每个元素都是numpy.ndarray。我想提取每个i的{​​{1}}个元素,并从中形成一个新的DataFrame。所以我定义了ndarray

f

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

df

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

我意识到如果我为f使用MultiIndexing会更容易,但是现在,这就是我正在使用的。有没有办法在熊猫中做我想做的事情?理想情况下,我希望避免循环遍历df中的所有列,并且我不明白为什么df不会使用关键字参数,而applymap

另外,我目前理解它的方式(我可能错了),当我使用apply时,它会给我每行/列的df.apply个元素,而不是{{ 1}} - i中包含的每个i的元素。

更新:

所以我意识到我可以将ndarray分成系列,然后使用可以做我想要的df。让我生成一些数据来表明我的意思:

df

完全符合我的期望,并希望它能做到。但是,尝试使用DataFrame:

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,))

3 个答案:

答案 0 :(得分:1)

你可以使用它:

<link rel="stylesheet" type="text/css" href="https://developer.api.autodesk.com/viewingservice/v1/viewers/style.css" />
<script src="https://developer.api.autodesk.com/viewingservice/v1/viewers/three.min.js?v=2.13.*"></script>
<script src="https://developer.api.autodesk.com/viewingservice/v1/viewers/viewer3D.min.js?v=2.13.*"></script>

答案 1 :(得分:0)

Pandas applymap不接受参数DataFrame.applymap(func)。如果您希望将i状态保持为状态,则可以将其存储为func访问/修改的全局变量,或使用decorator

但是,我建议您尝试使用apply方法。

答案 2 :(得分:0)

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

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))