考虑此示例
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
进行分组,并能够调用使用当前组(在此示例中为function
或a
)的值的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
有什么想法吗? 谢谢!
答案 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')