Вы можете groupby
date
и использовать transform
, чтобы добавить столбец с sum
цен на группу:
df['cumsprice'] = df.groupby('date').price.transform('sum')
id price hour minute date cumsprice
0 1 10 3 7 01/11 19
1 2 4 3 59 01/11 19
2 3 5 2 21 01/11 19
3 4 6 3 47 02/09 6
4 5 1 4 28 02/04 1
Обновление
Обновление после изменения ожидаемого решения. Чтобы сгруппировать по последовательным датам, которые равны, вы можете создать собственный группировщик, проверив, на каких строках изменяются даты, и взяв cumsum
из них:
g = df.date.ne(df.date.shift(1))
df['cumprice'] = df.groupby(g.cumsum()).price.transform('sum')
print(df)
id price hour minute date cumsprice cumprice
0 1 10 3 7 01/11 31 19.0
1 2 4 3 59 01/11 31 19.0
2 3 5 2 21 01/11 31 19.0
3 4 6 3 47 02/09 6 6.0
4 5 1 4 28 02/04 1 1.0
5 6 12 5 50 01/11 31 12.0
Ruby хорошо обрабатывает несколько аргументов.
Вот довольно хороший пример.
def table_for(collection, *args)
p collection: collection, args: args
end
table_for("one")
#=> {:collection=>"one", :args=>[]}
table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}
table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}
table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}
table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}
(Вывод вырезан и вставлен от irb)
Просто назовите это так:
table_for(@things, *args)
Оператор splat
( *
) выполнит эту работу, без необходимости изменять метод.