2017-02-11 55 views
1

我想根據多個條件從數據框創建查找表。我有以下DF:從數據框創建查找表

N = 100 
L = ['AR1', 'PO1', 'RU1'] 

np.random.seed(0) 

df3 = pd.DataFrame(
    {'X':np.random.uniform(1,4,N), 
    'Y':np.random.uniform(1,4,N), 
    'Z':np.random.uniform(1,4,N), 
    'LG':np.random.choice(L,N), 
    }) 

df3['bins_X'] = df3.groupby('LG')['X'].apply(pd.qcut, q=5, labels=np.arange(5)) 
df3['bins_Y'] = df3.groupby('LG')['Y'].apply(pd.qcut, q=5, labels=np.arange(5)) 
df3['bins_Z'] = df3.groupby('LG')['Z'].apply(pd.qcut, q=5, labels=np.arange(5)) 
df3['bins_X_int'] = df3.groupby('LG')['X'].apply(pd.qcut, q=5) 
df3['bins_Y_int'] = df3.groupby('LG')['Y'].apply(pd.qcut, q=5) 
df3['bins_Z_int'] = df3.groupby('LG')['Z'].apply(pd.qcut, q=5) 

df3.head() 

enter image description here

從中我想創建以下lookup_table:

enter image description here

因此,通過 'LG' 分組,從0排垃圾箱到4.我需要的是示例lookup_table填充與數據框中的關聯bin_intervals。

回答

2

IIUC:

def get_ints(s, q): 
    return pd.Series(pd.qcut(s, q).sort_values().unique()) 

d1 = df3.set_index('LG')[list('XYZ')].stack() 
g = d1.groupby(level=[0, 1]) 
g.apply(get_ints, q=5).unstack(1).rename_axis(['LG', 'bin_number']).reset_index() 

    LG bin_number    X    Y    Z 
0 AR1   0 [1.306, 1.926] [1.0556, 1.875] [1.0493, 1.819] 
1 AR1   1 (1.926, 2.447] (1.875, 2.757] (1.819, 2.595] 
2 AR1   2 (2.447, 2.812] (2.757, 3.0724] (2.595, 2.95] 
3 AR1   3 (2.812, 3.0744] (3.0724, 3.376] (2.95, 3.334] 
4 AR1   4 (3.0744, 3.936] (3.376, 3.803] (3.334, 3.885] 
5 PO1   0 [1.0564, 1.286] [1.0955, 1.566] [1.074, 1.596] 
6 PO1   1 (1.286, 1.868] (1.566, 1.911] (1.596, 1.895] 
7 PO1   2 (1.868, 2.682] (1.911, 2.669] (1.895, 2.426] 
8 PO1   3 (2.682, 3.29] (2.669, 2.958] (2.426, 3.283] 
9 PO1   4 (3.29, 3.965] (2.958, 3.676] (3.283, 3.848] 
10 RU1   0 [1.0141, 1.452] [1.0351, 2.158] [1.0397, 1.632] 
11 RU1   1 (1.452, 1.983] (2.158, 2.49] (1.632, 2.223] 
12 RU1   2 (1.983, 2.622] (2.49, 3.0893] (2.223, 3.0732] 
13 RU1   3 (2.622, 3.226] (3.0893, 3.673] (3.0732, 3.729] 
14 RU1   4 (3.226, 3.929] (3.673, 3.997] (3.729, 3.971] 
+0

感謝piR,一個問題。您再次使用qcut再次使用這個新表,這個返回的結果是否與我用於創建原始數據框的原始qcut完全相同? – Zanshin

+0

另一個問題,也許你沒有注意到,但我添加了一個新的問題:http://stackoverflow.com/questions/42094873/incorrect-results-when-applying-solution-to-real-data,關於使用您的解決方案到另一個。你可以看看嗎? – Zanshin

+0

是的!這意味着你可以使用查找表來填寫'df3'的其餘部分。你稱它6次。這樣,你只需要調用它3次。我會繼續努力展示這方面的內容。 – piRSquared

1

IIUC你能做到這樣:

In [55]: lkp = df3[['LG']].sort_values('LG').copy() 

In [56]: lkp['bin_number'] = lkp.groupby('LG').cumcount() 

In [57]: lkp 
Out[57]: 
    LG bin_number 
0 AR1   0 
46 AR1   1 
25 AR1   2 
26 AR1   3 
57 AR1   4 
28 AR1   5 
29 AR1   6 
56 AR1   7 
31 AR1   8 
32 AR1   9 
.. ...   ... 
45 RU1   24 
98 RU1   25 
55 RU1   26 
58 RU1   27 
60 RU1   28 
61 RU1   29 
63 RU1   30 
64 RU1   31 
39 RU1   32 
99 RU1   33 

[100 rows x 2 columns] 
+0

對不起,我不明白。我需要用關聯bin間隔填寫示例lookup_table。除此之外,每個'LG'只有5個bin_numbers,你還有更多?我會更新這個問題,以便更清楚。 – Zanshin