仅在开始日期和结束日期之间按标识符求和两列

时间:2019-12-12 16:59:11

标签: python pandas dataframe pandas-groupby

考虑以下几点:

数据框:

final WeightedObservedPoints wopts = new WeightedObservedPoints();
//Add observed points to wopts: 
...
final PolynomialCurveFitter curveFitter = PolynomialCurveFitter.create(1);
double[] coeff = {0.0, 042};  //y = 0.042x + 0
curveFitter.withStartPoint(coeff);
final double[] bestPrediction = curveFitter.fit(wopts.toList());

我想对所有“值”列求和,它们的endId在同一ownerId的当前startId和当前endId之间。

输出应为:

id    enddate         startdate        ownerId   value
1     2019-10-05      2019-10-05       10        105 
2     2019-10-06      2019-10-05       10        240
3     2019-10-07      2019-10-05       10        420
4     2019-10-08      2019-10-08       10        470
5     2019-10-01      2019-10-01       11        320
6     2019-10-02      2019-10-01       11        18
7     2019-10-10      2019-10-10       12        50
8     2019-10-12      2019-10-10       12        412
9     2019-10-14      2019-10-10       12        398
10    2019-10-15      2019-10-12       12        320

我尝试使用groupby.sum等,但无法获得所需的信息...

有关如何执行此操作的任何建议?

2 个答案:

答案 0 :(得分:2)

您可以按照说明进行操作:

df['output'] = df.apply(lambda row:
    df[df.ownerId.eq(row.ownerId) & df.enddate.between(row.startdate, row.enddate)]
    .value.sum(), axis=1)

答案 1 :(得分:1)

如果数据集不太大,这是一种使用自联接的方法:

df[['startdate','enddate']] = df[['startdate','enddate']].apply(pd.to_datetime)

df['output'] = (df.merge(df, on='ownerId', suffixes=('','_y'))
                  .query('startdate <= enddate_y <= enddate')
                  .groupby('id')['value_y']
                  .sum()
                  .to_numpy())

print(df)

输出:

   id    enddate  startdate  ownerId  value  output
0   1 2019-10-05 2019-10-05       10    105     105
1   2 2019-10-06 2019-10-05       10    240     345
2   3 2019-10-07 2019-10-05       10    420     765
3   4 2019-10-08 2019-10-08       10    470     470
4   5 2019-10-01 2019-10-01       11    320     320
5   6 2019-10-02 2019-10-01       11     18     338
6   7 2019-10-10 2019-10-10       12     50      50
7   8 2019-10-12 2019-10-10       12    412     462
8   9 2019-10-14 2019-10-10       12    398     860
9  10 2019-10-15 2019-10-12       12    320    1130