python外部输入参数,关于python:pandas.DataFrame:如何使用外部参数applymap()

有关更清楚的描述,请参见末尾的更新。

根据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的情况并非如此。

我想应用一个elementwise函数f(a, i),其中a是元素,i是手工输入的参数。我需要这样做的原因是因为我将在一个循环中执行df.applymap(f),for i in some_list。

举一个我想要的例子,假设我有一个数据框架df,其中每个元素都是numpy.ndarray。我想提取每个ndarray的i第个元素,并从中形成一个新的数据帧。所以我定义了我的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第个元素,而不是df中包含的每一个ndarray的i第个元素。

更新:

所以我才意识到我可以把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,))

给了我一本书。

您可以使用它:

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

大熊猫applymap不接受争论,DataFrame.applymap(func)不接受争论。如果要将i保持为状态,可以将其存储为由func访问/修改的全局变量,也可以使用decorator。

不过,我建议您尝试使用apply方法。

我要更新我的帖子,请稍等。

请参阅更新。有没有一种方法可以让apply函数按我想要的做?我不太明白它给我带来的错误(有大量的文本),但我假设它试图返回b的第1行(0),而不是b的每个元素的i。

您想在列表或系列上使用f,还是在二维数据帧上使用?pandas apply沿数据帧的输入轴应用功能。而applymap则将一个函数应用于一个数据帧,该数据帧旨在对元素进行操作,例如对数据帧中的每个序列执行map(func,series)。

本质上,我希望applymap的功能(所以在df/b的每个元素上应用func),同时能够将我的"外部"参数i传递到func中。正如您所说,我似乎可以使用全局变量或函数属性或其他东西,或者只是将df拆分为系列,但我只是想知道是否有一种方法可以直接在熊猫中实现这一点。

这取决于如何定义二维数组的i-th元素?如果是i = row * n_col + col,熊猫就没有直接的方法,但是您可以考虑使用apply两次,或者先将数据帧展平到列表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值