【问题标题】:Create a lookup table from dataframe从数据框创建查找表
【发布时间】:2017-02-11 11:37:16
【问题描述】:

我想根据多个条件从数据框创建一个查找表。我有以下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()

我想从中创建以下lookup_table:

因此,按“LG”分组,bin 的排名从 0 到 4。我需要的是用数据帧中的关联 bin_intervals 填充的示例 lookup_table。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    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]
    

    【讨论】:

    • 谢谢 piR,不过还是个问题。您再次对这个新表使用 qcut,这个返回的结果与我用来创建原始数据帧的原始 qcut 中的结果完全相同吗?
    • 另一个问题,也许你没有注意到,但我添加了一个新问题:stackoverflow.com/questions/42094873/…,关于你的解决方案对另一个问题的使用。你能看一下吗?
    • 是的!这意味着您可以使用查找表来填写df3 的其余部分。你叫它6次。这样,你只需要调用它 3 次。我会继续努力展示这方面的内容。
    • 是的,除了 bin_numbers 之外,我还添加了 int,试图弄清楚如何查找属于 bin_number 的 int。我现在可以在这里使用您的解决方案放弃整数。注意:函数中需要的 bin_numbers,后续函数需要查找的 int。简而言之,就是一个 int 中的数字,关联的 bin_number 是什么。将来我可能会为此发布另一个问题。
    • 我已经为上述问题添加了赏金。它涉及您之前提供的解决方案。您可能会解决什么问题?
    【解决方案2】:

    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]
    

    【讨论】:

    • 对不起,我不明白。我需要用关联的 bin 间隔填写示例 lookup_table。除此之外,每个“LG”只有 5 个 bin_numbers,你还有很多吗?我会更新问题以使其更清楚。
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2020-01-13
    • 2021-12-22
    • 2020-02-23
    相关资源
    最近更新 更多