考虑以下几点:
数据框:
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等,但无法获得所需的信息...
有关如何执行此操作的任何建议?
答案 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