【问题标题】:Is it possible to do applymap using the groupby in pandas?是否可以在熊猫中使用 groupby 进行应用映射?
【发布时间】:2017-06-29 11:53:01
【问题描述】:

在 pandas Dataframe 中,我想使用 groupby(使用一些列索引值)来 applymap(somefunction)

mcve_01.txt

pos         index      M1      M2      F1_x 
16230484    141      G/G      G/G       G
16230491    141      C/C      C/C       C
16230503    141      T/T      T/T       T
16230524    141      T/T      T/T       T
16230535    141      .    .         T
16232072    211      A/A      A/A       A
16232072    211      A/A      A/A       A
16229783    211      C/C      C/C       G
16229992    211      A/A      A/A       G
16230007    211      T/T      T/T       A
16230011    263      G/G      G/G       C
16230049    263      A/A      A/A       T
16230174    263      .         .        T
16230190    263      A/A      A/A       T
16230260    263      A/A      A/A       G

我编写了函数来对 A、B、C、D 列进行一些分析 其中 A、B、C 和 D 中的值是列表。

mcve_data = pd.read_csv('mcve_01.txt', sep='\t')

mcve_data.set_index(['pos', 'index'], append= True, inplace = True)
mcve_list = mcve_data.applymap(lambda c:[list(c)])

说功能是,

def mapfun(c):
if any(['.' in l for l in c]):
    return '.'

if all(['|' in l for l in c]):
    fun = zip

else:
    fun = product

filt_set = set(['|','/'])
filt = partial(filter,lambda l: not (l in filt_set))

return ','.join('g'.join(t) for t in fun(*map(filt, c)))

最后:

mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').\
    applymap(mapfun)

这给了我(最终输出)

pos    index      M1        M2      F1_x    
16230484    141  CgG,CgG,CgG,CgG        CgG,CgG,CgG,CgG         CgG
16230491    141  TgC,TgC,TgC,TgC        TgC,TgC,TgC,TgC         TgC
.....      ...   TgT,TgT,TgT,TgT        TgT,TgT,TgT,TgT         TgT
               .        .       TgT
               .        .       AgT
               AgA,AgA,AgA,AgA          AgA,AgA,AgA,AgA         AgA
               CgA,CgA,CgA,CgA          CgA,CgA,CgA,CgA         GgA
               AgC,AgC,AgC,AgC          AgC,AgC,AgC,AgC         GgG
               TgA,TgA,TgA,TgA          TgA,TgA,TgA,TgA         AgG
               GgT,GgT,GgT,GgT          GgT,GgT,GgT,GgT         CgA
               AgG,AgG,AgG,AgG          AgG,AgG,AgG,AgG         TgC

因此,如果我想在不分组的情况下为整个数据帧运行函数 (mapfun),则此代码有效。但是,我想通过按 index 值对它们进行分组来运行该函数。

不幸的是,我没有看到任何 groupby 和 applymap 一起使用的示例。

我尝试重新索引索引列,然后将函数 (mapfun) 包装在 apply 中,但没有成功。

mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').groupby(['f1_index'], group_keys = False).apply(lambda x: [mapfun])

我没有收到任何错误,但是在尝试分组然后应用时功能部分搞砸了。

我得到的输出:

f1_index
141.0     [<function mapfun at 0x7fee93550f28>]
211.0     [<function mapfun at 0x7fee93550f28>]
263.0     [<function mapfun at 0x7fee93550f28>]
dtype: object

预期输出:

与最终输出相同,但输出(功能部分)按公共索引值分组

现在,我想通过使用列或索引之一中的值对数据/帧进行分组来获取此功能并在此列中应用映射。

data_groupby = (df+df.shift(1)).dropna(how='all').\
applymap(fnc) using groupby

我尝试重置索引,然后使用索引名称进行分组。但是,def fnc() 特定于 A、B、C、D 列中的数据。 另外,我没有在 pandas df 中找到任何使用 applymap 和 groupby 的示例和教程。

【问题讨论】:

  • 这感觉就像XY problem,其中applymap 是您尝试解决您未解释的问题的方法。您省略了很多类似函数和真实数据点。请备份并解释真正的问题,即原始输入和期望输出。
  • @Parfait:请稍等。

标签: python pandas lambda group-by python-applymap


【解决方案1】:

DataFrameGroupBy 是 DataFrames 的字典,而不是单个 DataFrame。您可以在子组上使用applymap

import pandas as pd
from numpy.random import random, randint

# Dummy data
vdata = pd.DataFrame(randint(2, size=(32,4)))
vdata.columns=[list('ABCD')]

vgb = vdata.groupby(('A','B'))
altered = []
for index, subframe in vgb:
    subframe = subframe.applymap(lambda x: x*2)
    altered.append(subframe)
    print index
    print subframe
    assert(subframe.A.mean() == index[0]*2)
    assert(subframe.B.mean() == index[1]*2)

vdata = pd.concat(altered)
print vdata

【讨论】:

  • 你能再看看问题和数据。我刚刚更新了它。
  • 刚刚尝试实施您的方法来解决问题,但没有成功。看起来我的 applymap 函数的准备方式在使用 groupby 时不会被逐个单元格读取。
  • 仍然不是 [MVCE],调试起来太繁琐了。 applymap 逐个单元格地应用一个函数,这就是它的作用。
  • 唯一需要调试的部分是最后一个。我想用 group by 运行 mcve_mm=... 的地方。不过,它在没有 group by 的情况下工作得很好。我试图对这段代码之前的数据进行分组,但后来它说 groupby 没有 applymap 属性。我阅读了几个教程,仍然没有找到有用的。是的,我的分析需要逐个单元完成,否则 apply 会起作用。试图用 apply(lambda x: [mapfun] x in c) 包装 mapfun 但我认为这是错误的。啊!
  • 你说“groupby 没有 applymap 属性”——你明白groupby 是一个返回字典的函数吗?您在 DataFrame 上运行 applymap,这些 DataFrame 是 groupby 返回的 元素
猜你喜欢
  • 2021-02-18
  • 1970-01-01
  • 2020-05-28
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多