【问题标题】:trapz integration on dataframe index after grouping分组后数据帧索引上的trapz集成
【发布时间】:2019-08-12 10:12:55
【问题描述】:

我有一些数据,我想先按某个间隔对目标列进行分组,然后按索引间距对目标列进行整合。

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')

【问题讨论】:

  • 由于系列只有一列,列名有点无关紧要。您可以使用g.values 获取系列的值或使用g.index.values 获取其索引的值
  • 你能产生预期的输出更清晰吗?
  • 您是否试图在每一行中获取第一个间隔和当前间隔之间的积分?另一方面,您是按“目标”列分组,而不是按您所说的“A”分组。应用前的数据切片是 `ABC Target Target (0.0, 100.0] 0.0 0.0 0.0 0.0 (100.0, 200.0] 0.0 0.0 0.0 0.0 ... (8100.0, 8200.0] 141.0 16.5 63.5 8200.0 (8200.0, 8300.0.0) 8300.0`

标签: python-3.x numpy scipy


【解决方案1】:

您的代码中有几个问题:

  • 您创建的数据框副本具有我认为 integrate.trapz 无法处理的分类索引。

  • 使用 apply 时,您将Integrate.trapz 应用到每一行。这是没有意义的。出于这个原因,我在评论中询问您是否需要在每一行中,在该行中从 0 到目标值的积分。

如果您想按“目标”列中 100 的间隔从 0 转换数据,首先您可以按“目标”的间隔从 0 到 100 得到总和

>>>i_df = df.groupby(pd.cut(df.iloc[:, 3], np.arange(0, max(df.iloc[:, 3]) + 100, 100))).sum()

然后你得到'Target'列的梯形积分,间隔为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

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2021-02-02
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2020-02-12
    • 2018-03-09
    • 2021-11-04
    相关资源
    最近更新 更多