pandas 从多列中的一列进行Python多条件查找

vq8itlhq  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(135)

尝试根据另一个 Dataframe 中的多个条件查找将因子添加到 Dataframe 。用于创建示例数据的代码:

import pandas as pd

df_RawData = pd.DataFrame({
    'Value' : [31000, 36000, 42000],
    'Type' : [0,1,5]
})

df_Lookup = pd.DataFrame({
    'Min Value' : [0,10000,20000,25000,30000,35000,40000,45000],
    'Max Value' : [9999,19999,24999,29999,34999,39999,44999,49999],
    'Type 0' : [.11,.21,.31,.41,.51,.61,.71,.81],
    'Type 1' : [.10,.20,.30,.40,.50,.60,.70,.80],
    'Type 2' : [.09,.19,.29,.39,.49,.59,.69,.79],
    'Type 3' : [.08,.18,.28,.38,.48,.58,.68,.78],
    'Type 4' : [.07,.17,.27,.37,.47,.57,.67,.77],
    'Type 5' : [.06,.16,.26,.36,.46,.56,.66,.76]
})

我需要根据最小值和最大值范围内的值向第一个数据框添加一列,并且只返回匹配类型的因子。在这种情况下,最终期望的输出将是:
| 数值|型号|因子|
| - -|- -|- -|
| 小行星31000|第0页|点五十一|
| 小行星36000|一个|点60口径|
| 小行星42000|五个|点六六|
RawData是一个至少有50万行的数据集。
我尝试使用IntervalIndex,但无法弄清楚如何根据类型从不同的列返回值。例如,这将处理最小/最大查找,并始终返回类型5的因子:

v = df_Lookup.loc[:, 'Min Value':'Max Value'].apply(tuple, 1).tolist()
idxr = pd.IntervalIndex.from_tuples(v, closed='both')
df_RawData['Factor'] = df_Lookup.loc[idxr.get_indexer(df_RawData['Value']),['Type 5']].values

另外,我考虑使用melt来重新排列查找 Dataframe ,但不确定如何合并类型以及是否在最小/最大范围内。如果数据集较小,我会在Excel中使用vlookup,并在公式的返回列部分使用if语句,但考虑到数据集的大小,这并不实用。

fd3cxomn

fd3cxomn1#

创建间隔索引:

intervals = pd.IntervalIndex.from_arrays(df_Lookup['Min Value'], 
                                         df_Lookup['Max Value'], 
                                         closed='neither')

获取匹配位置:

pos = intervals.get_indexer(df_RawData.Value)

Type列建立索引-幸运的是,它们是经过排序的:

types = df_Lookup.filter(like='Type').to_numpy()
out = types[pos, df_RawData.Type]

赋值:

df_RawData.assign(Factor = out)

   Value  Type  Factor
0  31000     0    0.51
1  36000     1    0.60
2  42000     5    0.66

相关问题