在Python中,自定义函数适用于整个数据帧,但不适用于分组数据帧(与';groupby';函数一起应用)

在Python中,自定义函数适用于整个数据帧,但不适用于分组数据帧(与';groupby';函数一起应用),python,function,pandas-groupby,Python,Function,Pandas Groupby,我有一个简单的数据框,我希望将groupby函数应用于列“a”,并根据定义的函数(函数中的循环)生成新的列,该函数从列“B”和列“C”中获取值。我的问题是,我能够将该函数用于整个数据帧,但不能用于分组数据帧(异常:已选择列B)。我不知道为什么它会在分组数据帧上抛出错误,但不会在整个数据帧上抛出错误。我的实施情况如下: >>> import pandas as pd >>> >>> df = pd.read_csv("foo.txt", sep

我有一个简单的数据框,我希望将
groupby
函数应用于列“a”,并根据定义的函数(函数中的循环)生成新的列,该函数从列“B”和列“C”中获取值。我的问题是,我能够将该函数用于整个数据帧,但不能用于分组数据帧(
异常:已选择列B
)。我不知道为什么它会在分组数据帧上抛出错误,但不会在整个数据帧上抛出错误。我的实施情况如下:

>>> import pandas as pd
>>>
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>>
>>> def calc(data):
...         length = len(data['B'])
...         mx = data['B'][0]
...         nx = data['C'][0]
...         for i in range(1,length):
...                 my = data['B'][i]
...                 ny = data['C'][i]
...                 nx = nx + ny
...                 mx=(mx*nx+my*ny)/(nx+ny)
...         return(mx)
...
>>> df_grouped = df.groupby(['A'])
>>> calc(df)
4.217694879423274
>>> calc(df_grouped)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in calc
  File "/mnt/projects/kokep/kokep/devel/miniconda3/lib/python3.6/site-packages/pandas/core/base.py", line 250, in __getitem__
    .format(selection=self._selection))
Exception: Column(s) B already selected
>>>
>>将熊猫作为pd导入
>>>
>>>df=pd.read\u csv(“foo.txt”,sep=“\t”)
>>>df
A、B、C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>>
>>>def计算(数据):
...         长度=长度(数据['B'])
...         mx=数据['B'][0]
...         nx=数据['C'][0]
...         对于范围内的i(1,长度):
...                 my=数据['B'][i]
...                 ny=数据['C'][i]
...                 nx=nx+ny
...                 mx=(mx*nx+my*ny)/(nx+ny)
...         返回(mx)
...
>>>df_grouped=df.groupby(['A'])
>>>计算(df)
4.217694879423274
>>>计算(df_分组)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第3行,计算格式
文件“/mnt/projects/kokep/kokep/devel/miniconda3/lib/python3.6/site packages/pandas/core/base.py”,第250行,在__
.格式(选择=自选择)
例外:已选择列B
>>>

我怎样才能让它工作?提前感谢。

我认为您的groupby正在制作pandas.series,您的功能不适用于此系列。我尝试过使用不同的groupby方法,但由于某些原因,它不起作用。一旦我找到了解决方案,我会把它贴在这里。

我解决了这个问题。我认为需要为每个组应用
reset\u index
功能:

>>> import pandas as pd
>>>
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>>
>>> def calc(data):
...         length = len(data['B'])
...         mx = data['B'][0]
...         nx = data['C'][0]
...         for i in range(1,length):
...                 my = data['B'][i]
...                 ny = data['C'][i]
...                 nx = nx + ny
...                 mx=(mx*nx+my*ny)/(nx+ny)
...         return(mx)
...
>>> result = []
>>> for name, group in df.groupby('A'):
...         group = pd.DataFrame(group).reset_index()
...         out = calc(group)
...         result.append(out)
...
>>> result
[3.488215488215488, 5.866666666666666]

也许你应该和每个小组分开工作。