如何在groupby中将当前组作为参数传递?

时间:2018-09-30 03:27:00

标签: python pandas

考虑此示例

df = pd.DataFrame({'group' : ['a','a','a','b','b'],
                   'value' : [1,2,3,10,20]})

Out[39]: 
  group  value
0     a      1
1     a      2
2     a      3
3     b     10
4     b     20

基本上,我想按group进行分组,并能够调用使用当前组(在此示例中为functiona)的值的b作为争论。也就是说,我的函数将当前的value及其对应的group作为输入。

类似

def myfunc(mygroup, myvalue):
    return myvalue.astype(str) + mygroup

df.groupby('group').value.apply(lambda x: myfunc(mygroup,x))

这不起作用。 预期输出为:

Out[38]: 
0     1a
1     2a
2     3a
3    10b
4    20b

有什么想法吗? 谢谢!

4 个答案:

答案 0 :(得分:2)

您可以尝试对数据框进行分组并在groupby函数中添加特定列

df.groupby(['group']).apply(lambda x: x['value'].astype(str) + x['group'])

出局:

group   
a      0     1a
       1     2a
       2     3a
b      3    10b
       4    20b
dtype: object

您还可以尝试逐个循环这些组并将该组添加到值中

pd.concat([g['value'].astype(str)+i for i,g in df.groupby(['group'])])

出局:

0     1a
1     2a
2     3a
3    10b
4    20b
Name: value, dtype: object

答案 1 :(得分:2)

df.groupby(level=0).apply(lambda x:x['value'].astype(str)+ x['group'])

答案 2 :(得分:2)

在已经有组列使用的情况下,您不需要任何group函数:

df['value'].astype(str)+df['group']

0     1a
1     2a
2     3a
3    10b
4    20b
dtype: object

答案 3 :(得分:1)

通过修改代码来获得所需的准确输出:

<stdio.h>

其他说明,可能会满足您的好奇心。

SeriesGroupBy

执行<stdlib.h>将产生mciSendString("open \"filename.mp3\" type mpegvideo alias mp3", NULL, 0, NULL); //open mciSendString("play mp3", NULL, 0, NULL); //play 列的def myfunc(mydf): return mydf.value.astype(str)+mydf.group df.groupby('group').apply(myfunc).reset_index(level=0, drop=True) 对象,该对象已按列df.groupby('group').value分组,因此当您在自己的计算机中调用SeriesGroupBy时代码,则应将Series(列value)作为函数的参数。

group

DataFrameGroupBy

另一方面,执行.apply将得到value的对象,因此调用df.groupby('group').value.apply(lambda x: x.astype(str)+group)) # x is Series of column 'value'. This will raise error, since 'group' isn't recognized` df.groupby('group').value.apply(lambda x: x.astype(str)+df.group)) # use dataframe 'df' to access column 'group' 将期望将Dataframe作为函数的参数。因此,您可以访问所有列,例如:

df.groupby('group')