我有一些数据,我想先按一定间隔对目标列进行分组,然后再按索引间距对目标列进行积分。
import numpy as np
import pandas as pd
from scipy import integrate
df = pd.DataFrame({'A': np.array([100, 105.4, 108.3, 111.1, 113, 114.7, 120, 125, 129, 130, 131, 133,135,140, 141, 142]),
'B': np.array([11, 11.8, 12.3, 12.8, 13.1,13.6, 13.9, 14.4, 15, 15.1, 15.2, 15.3, 15.5, 16, 16.5, 17]),
'C': np.array([55, 56.3, 57, 58, 59.5, 60.4, 61, 61.5, 62, 62.1, 62.2, 62.3, 62.5, 63, 63.5, 64]),
'Target': np.array([4000, 4200.34, 4700, 5300, 5800, 6400, 6800, 7200, 7500, 7510, 7530, 7540, 7590,
8000, 8200, 8300])})
df['y'] = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().apply(lambda g: integrate.trapz(g.Target, x = g.index))
上面的代码给我:
AttributeError: ("'Series' object has no attribute 'Target'", 'occurred at index A')
如果我尝试这样做:
colNames = ['A', 'B', 'C', 'Target']
df['z'] = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().apply(lambda g: integrate.trapz(g[colNames[3]], x = g.index))
我得到:
TypeError: 'str' object cannot be interpreted as an integer
During handling of the above exception, another exception occurred:
....
KeyError: ('Target', 'occurred at index A')
答案 0 :(得分:1)
您的代码有几个问题:
您已经创建了带有分类索引的数据框副本,这是我认为integrate.trapz
无法处理的。
使用apply时,您正在对每个行应用integration.trapz。这是没有意义的。因此,我在评论中询问在每一行中是否需要从0到目标值的整数。
如果要像完成操作一样将“目标”列中的数据按0的间隔从100转换为数据,首先您可以按“目标”的间隔从0到100求和
>>>i_df = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum()
然后您将获得间隔为100的“目标”列的梯形积分
>>>integrate.trapz(i_df['Target'], dx=100)
10242034.0
您不能使用x = i_df.index,因为没有为时间间隔定义(trapz内部)操作减法,并且您已经创建了时间间隔索引。 如果需要使用数据框索引,则必须将其重置。
>>>i_df = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum().reset_index(drop=True)
>>>integrate.trapz(i_df['Target'], x=100*i_df.index)
10242034.0