在 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),则此代码可以工作。但是,我想通过按 索引 值对它们进行分组来运行该函数。
不幸的是,我没有看到任何同时使用 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
预期输出:
与最终输出相同,但输出(功能部分)按公共(public)索引值分组
现在,我想通过使用列或索引之一中的值对数据/帧进行分组来获取此函数并在此列中应用映射。
data_groupby = (df+df.shift(1)).dropna(how='all').\
applymap(fnc) using groupby
我尝试重置索引,然后使用索引名称进行分组。但是,def fnc() 特定于 A、B、C、D 列中的数据。 另外,我没有找到任何在 pandas df 中使用 applymap 和 groupby 的示例和教程。
最佳答案
DataFrameGroupBy 是 DataFrame 的字典,而不是单个 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
关于python - 是否可以使用pandas中的groupby来执行applymap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42171132/