我的输入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;组。我也在考虑只关注最大列并找到该数字所在的第一层。
但这些似乎不是最好的方法,任何提示?
答案 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}