给定多个两列的最小值/最大值如果数字落在最小值/最大值

时间:2016-07-29 16:44:58

标签: python pandas

我的输入CSV如下所示

Tier    | A   |     | B   |     | C   |   
        | Min | Max | Min | Max | Min | Max
1       | 0   | .5  | 0   | .25 | 0   | .92
2       |.51  | 1.0 | .26 | .50 | .93 | 1.5

给定一个输入字典{A: .56, B: .22, C: .99}我想返回{A: 2, B: 1, C: 2},这些层对应于该数字在该范围内的位置。

我的问题是,我不确定如何将标题读入多索引,或者即使它值得打扰。

目前我尝试过的方法是将列相互压缩,然后将这些列转换为一个列元组,将元组存储在每个最小值/最大值的每一组中,并且#B;&B;组。我也在考虑只关注最大列并找到该数字所在的第一层。

但这些似乎不是最好的方法,任何提示?

2 个答案:

答案 0 :(得分:2)

跳过前几行。您可以使用kwarg header=[0,1]将前两行作为MultiIndex读取,但0级中的缺失值会导致使用占位符名称(在没有&#的列中) 39; A',' B'或' C'。

有关args / kwargs的详细信息,请参阅read_csv docs

df = pd.read_csv('tmp.csv', sep=' *\| *', skiprows=2, index_col=0, header=None)
df.columns = pd.MultiIndex.from_product([('A', 'B', 'C'), ('Min', 'Max')])

def get_indicator(letter, val, df):
    m = (df[letter]['Min'] <= val) & (df[letter]['Max'] >= val)
    m = m[m]
    return None if m.empty else m.index[0]

d = {A: .56, B: .22, C: .99}

res = {k: get_indicator(k, v, df) for (k, v) in d.items()}

答案 1 :(得分:0)

使用此设置:

arrays = [[0, .5, 0, .25, 0, .92,],[.51,1, .26, .5, .93, 1.5, ]]
col    = pd.MultiIndex.from_product([('A', 'B', 'C'), ('Min', 'Max')])
df     = pd.DataFrame(arrays, columns=col )

     A          B           C      
    Min  Max   Min   Max   Min   Max
0  0.00  0.5  0.00  0.25  0.00  0.92
1  0.51  1.0  0.26  0.50  0.93  1.50


dd     = {'A':.56,'B':.22, 'C':.99}

试试这个:

ddOut = {}
for k,v in dd.iteritems():
    if   v <= df[(k, "Max")][0]                          : ddOut[k] = 1
    elif v >= df[(k, "Max")][0] and v < df[(k, "Max")][1]: ddOut[k] = 2

print ddOut
{'A': 2, 'C': 2, 'B': 1}