我有两个数据帧,ret
和bins
。我想从bins
获取索引值,为bins
中的每一行创建一个范围,然后使用该范围列表从ret
中选择数据。当我传递切片索引(手动键入)时,这种方式可以工作,但是当我传递保存在变量a
ret = pd.DataFrame({'px': [.1, -.15, .30, -.20, .05]})
bins = pd.DataFrame({'t1': [3,4]}, index=[1,2])
a = []
for i, b in bins.iterrows():
a.append(slice(i, b.t1))
print('a',a)
print('np.r_[a]',np.r_[a])
print('np.r[slice',np.r_[slice(1, 3, None) , slice(1, 4, None)])
print(ret.iloc[np.r_[slice(1, 3, None) , slice(1, 4, None)]]) # this WORKS
print(ret.iloc[a] #this DOES NOT WORK)
这是输出:
a [slice(1, 3, None), slice(2, 4, None)]
np.r_[a] [slice(1, 3, None) slice(2, 4, None)]
np.r[slice [1 2 1 2 3]
px
1 -0.15
2 0.30
1 -0.15
2 0.30
3 -0.20
...
TypeError: int() argument must be a string, a bytes-like object or a number, not 'slice'
答案 0 :(得分:0)
要在这里回答我自己的问题!问题是slice()太笨重而无法使用。更容易将数组列表展平。如果有人有任何建议,请在此处发布!
ret = pd.DataFrame({'px': [.1, -.15, .30, -.20, .05]})
bins = pd.DataFrame({'t1': [3,4]}, index=[1,2])
a = [ret[i:b.t1].index for i, b in bins.iterrows()]
out = [item for sublist in a for item in sublist]
print(ret.loc[out])
>>> px
>>>1 -0.15
>>>2 0.30
>>>2 0.30
>>>3 -0.20