2016-12-05 99 views
0

帶有兩列的pandas數據框(x):sum和value。總和是記錄的數量具有相同的值。例如:由裝載列切割的熊貓

sum value 
2  3 
4 1 

意味着2條具有價值3和第4條記錄的值爲1 而我想要做的是:按值排序,然後切[1,1,1,1,3,3]分成3部分:[1,1],[1,1],[3,3]

如何將值分成3部分,每部分的記錄數是否相等?

pandas.cut不能採取和列考慮

+1

所以實際上,你想分裂'[3,3,1,1,1,1,1,1,1,1,1,1]'三個?這樣做的規則究竟是什麼? –

+0

@JonClements是的,我在我的問題中添加了規則 –

+0

正確...那麼拆分的順序如何決定......爲什麼不是它[[3,3],[1,1],[1, 1]]或其他組合? –

回答

1

我認爲你可以使用cumsumnumpy.where

sumall = df['sum'].sum() 
df = df.sort_values(by='value') 
df['sum_sum'] = df['sum'].cumsum() 
df['tag'] = np.where(df['sum_sum'] < sumall/3, 0, 
      np.where(df['sum_sum'] < 2 * sumall/3, 1, 2)) 

print (df) 
    sum value sum_sum tag 
1 4  1  4 2 
0 2  3  6 2 
+0

如果總和太大而無法做記錄重複? –

+0

你能解釋更多嗎?內存問題? – jezrael

+0

我嘗試修改你的功能,請檢查是否工作正常。 – jezrael

0

這對我的作品。但醜陋的:

sum = df['sum'].sum() 
def func(x): 
    if x < sum/3: 
     return 0 
    elif x < 2 * sum/3: 
     return 1 
    return 2 
df = df.sort_values(by='value') 
df['sum_sum'] = np.cumsum(df['sum'].values) 
df['tag'] = df['sum_sum'].apply(func)