【问题标题】:Range mapping in PythonPython 中的范围映射
【发布时间】:2023-01-09 04:50:51
【问题描述】:

映射器数据框

 col_data = {'p0_tsize_qbin_':[1, 2, 3, 4, 5] ,
           'p0_tsize_min':[0.0, 7.0499999999999545, 16.149999999999977, 32.65000000000009, 76.79999999999973] ,
           'p0_tsize_max':[7.0, 16.100000000000023, 32.64999999999998, 76.75, 6759.850000000006]}
map_df = pd.DataFrame(col_data, columns = ['p0_tsize_qbin_', 'p0_tsize_min','p0_tsize_max'])
map_df

在上面的数据框中是map_df,其中第 2 列和第 3 列是范围,第 1 列是新数据框的映射器值。

主数据框

    raw_data = {
        'id': ['1', '2', '2', '3', '3','1', '2', '2', '3', '3','1', '2', '2', '3', '3'],
        'val' : [3, 56, 78, 11, 5000,37, 756, 78, 49, 21,9, 4, 14, 75, 31,]}
df = pd.DataFrame(raw_data, columns = ['id', 'val','p0_tsize_qbin_mapped'])
df

预期输出以蓝色标记

在 map_df min(column1) 和 max(columns2) 中查找 df 数据帧的 val,无论它位于何处,都会获得 p0_tsize_qbin_ 值。

例如:来自 df 数据帧 val = 3,位于 p0_tsize_minp0_tsize_max 的范围内,其中 p0_tsize_qbin_ ==1。所以 1 会回来

【问题讨论】:

    标签: python-3.x pandas dataframe range-map


    【解决方案1】:

    尝试使用pd.cut()

    bins = map_df['p0_tsize_min'].tolist() + [map_df['p0_tsize_max'].max()]
    labels = map_df['p0_tsize_qbin_'].tolist()
    df.assign(p0_tsize_qbin_mapped = pd.cut(df['val'],bins = bins,labels = labels))
    

    或者

    bins = pd.IntervalIndex.from_arrays(map_df['p0_tsize_min'],map_df['p0_tsize_max'])
    map_df.loc[bins.get_indexer(df['val'].tolist()),'p0_tsize_qbin_'].to_numpy()
    

    输出:

       id   val p0_tsize_qbin_mapped
    0   1     3                    1
    1   2    56                    4
    2   2    78                    5
    3   3    11                    2
    4   3  5000                    5
    5   1    37                    4
    6   2   756                    5
    7   2    78                    5
    8   3    49                    4
    9   3    21                    3
    10  1     9                    2
    11  2     4                    1
    12  2    14                    2
    13  3    75                    4
    14  3    31                    3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多