我想单独提取'S'的箱子,其中每列(X和Y)> 0.5,或多个箱子> 0.5*'行数'.
在这个例子中;
'AR1'应该只选择bin 4,因为'X'和'Y'> 0.5(蓝色表示)
因为'X'和'Y'是>(4*0.5)(指示黄色),所以'PO1'应该选择第1,2,3和4个区域.
我之前尝试过这个for loop
,但是没有正常工作;
有条件地选择多个(相邻)行
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)
编辑
应该看起来像是问题中显示的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.
EDIT2:@JohnE和piRSquared,你的解决方案都有效,但是当数据框中有其他列不应该被评估时,哪一个会更好?
另外,如果我想在您的解决方案中添加其他条件,该怎么办?
EDIT3:@piRSquared,在对某些列进行子集化时,我只返回那些列,我需要所有列,而不仅仅是子集.
你能帮忙吗?谢谢.