簡體   English   中英

如何根據列的相等部分將切片分配給pandas數據框?

[英]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

不是最佳選擇。 這是一種貪婪的啟發式方法。 它遍歷列表並找到我們進入下一組的位置。 此時,它決定將當前點包含在當前組或下一組中是否更好。

這應該表現得非常好,除非價值觀存在巨大差異且價值較大的情況即將結束。 這是因為這個算法很貪婪,只能查看它當前所知的內容,而不是一次查看所有內容。

但就像我說的那樣,它應該足夠好了。

我認為,這是一種最優化問題(非線性),而熊貓絕對不是解決問題的好方法。

解決問題的基本思路如下:

  1. 定義:

    • n - 元素數量,
    • groupNo - 要分組的組數。
  2. 從生成初始解決方案開始 ,例如將連續的n / groupNo元素組放入每個bin中

  3. 定義目標函數 ,例如,每個組的總和與所有元素/組的總和之間的差的平方和。

  4. 執行迭代:

    • 對於來自不同箱櫃的每對元素ab ,計算新的目標函數值,如果這些元素被移動到另一個箱櫃,
    • 選擇能夠更好地改進目標函數的對並執行移動(將a從其當前bin移動到bin,其中b是,反之亦然)。
  5. 如果找不到這樣的對,那么我們得到最終結果。

也許有人會提出更好的解決方案,但至少這個解決方案是一個開始的概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM