[英]How do I assign tiles to a pandas data frame based on equal parts of a column?
我按特定列對大約100萬行數據幀進行了排序。 我想基於另一列的相等總和為每個觀察分配組,但我不知道如何做到這一點。
示例如下:
import pandas as pd
value1 = [25,27,20,22,28,20]
value2 = [.34,.43,.54,.43,.5,.7]
df = pd.DataFrame({'value1':value1,'value2':value2})
df.sort_values('value1', ascending = False)
df['wanted_result'] = [1,1,1,2,2,2]
像這個例子,我想總結我的列(示例列value1
)並指定組盡可能接近相等的value1總和。 這有功能嗎?
使用Numba的JIT來加速它。
from numba import njit
@njit
def partition(c, n):
delta = c[-1] / n
group = 1
indices = [group]
total = delta
for left, right in zip(c, c[1:]):
left_diff = total - left
right_diff = total - right
if right > total and abs(total - right) > abs(total - left):
group += 1
total += delta
indices.append(group)
return indices
df.assign(result=partition(df.value1.to_numpy().cumsum(), n=2))
value1 value2 result
4 28 0.50 1
1 27 0.43 1
0 25 0.34 1
3 22 0.43 2
2 20 0.54 2
5 20 0.70 2
這不是最佳選擇。 這是一種貪婪的啟發式方法。 它遍歷列表並找到我們進入下一組的位置。 此時,它決定將當前點包含在當前組或下一組中是否更好。
這應該表現得非常好,除非價值觀存在巨大差異且價值較大的情況即將結束。 這是因為這個算法很貪婪,只能查看它當前所知的內容,而不是一次查看所有內容。
但就像我說的那樣,它應該足夠好了。
我認為,這是一種最優化問題(非線性),而熊貓絕對不是解決問題的好方法。
解決問題的基本思路如下:
定義:
從生成初始解決方案開始 ,例如將連續的n / groupNo元素組放入每個bin中 。
定義目標函數 ,例如,每個組的總和與所有元素/組的總和之間的差的平方和。
執行迭代:
如果找不到這樣的對,那么我們得到最終結果。
也許有人會提出更好的解決方案,但至少這個解決方案是一個開始的概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.