在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]
也许你应该和每个小组分开工作。