我有一个很大的主题数据框。为了简单起见,我在下面发布了我的数据框的较小修改版本。
subject age sex
A 5.35 Female
B 5.70 Male
C 6.00 Female
D 6.07 Male
E 6.25 Male
F 6.88 Male
G 7.00 Female
H 7.02 Male
I 7.11 Female
J 8.00 Male
K 8.50 Female
我正在编写一个函数,它将输入
age
和 tail
(最终使用我拥有的大数据框输入 sex
)。所需的输出是从数据框中过滤出来的区间数据框,年龄输入是区间的中位数,tail
是中位数两侧的数据点数量,age
输入。
df.loc
并不完全是我想要的。示例功能如下:
def interval_set(age = 7, tail = 3):
# take dataframe above and output below:
Out[1]:
subject age sex
D 6.07 Male
E 6.25 Male
F 6.88 Male
G 7.00 Female
H 7.02 Male
I 7.11 Female
J 8.00 Male
提前致谢!
如果我理解正确的话,您需要在最接近目标的值之前和之后有 3 (
tail
) 个值(age
,此处为 7)。
你可以
sort_values
,然后用abs
差和idxmin
得到最接近目标的点,最后用布尔索引进行选择:
def interval_set(df, age=7, tail=3):
s = df['age'].sort_values()
idx = np.arange(len(s))-s.sub(age).abs().idxmin()
return df.loc[s.index[abs(idx)<=tail]]
out = interval_set(df)
输出:
subject age sex
3 D 6.07 Male
4 E 6.25 Male
5 F 6.88 Male
6 G 7.00 Female
7 H 7.02 Male
8 I 7.11 Female
9 J 8.00 Male