我想单独提取“S”的 bin,其中每列 (X&Y) > 0.5,或多个 bin > 0.5 *“行数”。
在示例中;
对于“AR1”,应仅选择 bin 4,因为“X”和“Y”> 0.5(蓝色指示)
对于“PO1”,应选择 bin 1、2、3 和 4,因为“X”和“Y”> (4 * 0.5)(黄色指示)。
我之前已经尝试过这个for loop
,但这没有正确工作;有条件地选择多个(相邻)行 https://stackoverflow.com/questions/41590518/selecting-multiple-neighboring-rows-conditionally
np.random.seed(0)
N = 20
S = ['AR1', 'PO1']
df = pd.DataFrame(
{'X':np.random.uniform(-1,1,N),
'Y':np.random.uniform(-1,1,N),
'S':np.random.choice(S,N),
})
df['bins_X'] = df.groupby('S')['X'].apply(pd.qcut, q=5, labels=np.arange(5)) # create bins per column 'S'
def func(df): # create function to group per 'S' and their bins
df1 = df.groupby(['S','bins_X']).sum()
new_cols= list(zip(df1.columns.get_level_values(0)))
df1.columns = pd.MultiIndex.from_tuples(new_cols)
return df1
print func(df)
EDIT
它应该看起来像问题中所示的 df ,但不符合条件的行被过滤掉。我检查的是这个;对于任何行(bin),单独或组合的 X 和 Y > 0.5 中的值。仅连续组合行,组合 2、3、4 或 5 行。
即,0 的行组合为 ; 0+1、0+1+2、0+1+2+3 和 0+1+2+3+4。对于 1 ; 1+2、1+2+3 和 1+2+3+4 等。
多行的总和等于行数 x 0.5,例如,对于第 0 行到第 4 行,X 和 Y 必须 > 2.5。
编辑2:
@JohnE 和 piRSquared,您的两个解决方案都有效,但是当数据框中存在不应评估的其他列时,哪一个会工作得更好?
另外,如果我想在你们的解决方案中添加一个附加条件怎么办?
编辑3:
@piRSquared,当对某些列进行子集化时,我只得到返回的那些列,而我需要所有这些列,而不仅仅是子集化的列。
你能帮忙吗?谢谢。