2017-01-19 6 views
2

cutDataFramecut (하위)을 기록해야합니다.팬더는 커트에서 DataFrame으로 열을 추가합니다.

서브 빈 경계가 모든 cut에 대해 동일하면 매우 간단합니다. 예를 들어,

df = pd.DataFrame({'A':np.random.random(100), 'B':np.random.random(100)}) 
# Primary bins: quintiles on column A 
df['P'] = pd.qcut(df['A'], 5, labels=range(1,6)).astype(int) 
# Secondary bins: quartiles on column B 
df['Q'] = df.groupby(['P'])['B'].transform(lambda x: pd.qcut(x, 4, labels=range(1,5))) 

그러나, 나는 변환 함수를 사용하는 방법, 또는 다시 cut 경계가 각 주 cut 다른있는 DataFrame,로 두 번째 cut 값을 얻는 방법을 알아낼 수 없습니다. 예를 들어,

subBinBounds = [[0, .1, .5, 1],[0, .3, .6, 1],[0, .2, .7, 1],[0, .4, .6, 1][0, .2, .5, 1]] 
for i in range(5): 
    cut = df[df['P'] == i+1] # P is in {1, 5} 
    subbin = pd.cut(cut['B'], subBinBounds[i], labels=range(1,4)) 
    cut['Q'] = cut.assign(Q=subbin.values) 
    # But how do we get 'Q' back into df? 

답변

2

할 수 있습니다 sers에 추가 루프에 concatsubseries-list of Series.

#for testing - get same output of random functions 
np.random.seed(100) 
df = pd.DataFrame({'A':np.random.random(100), 'B':np.random.random(100)}) 
# Primary bins: quintiles on column A 
df['P'] = pd.qcut(df['A'], 5, labels=range(1,6)).astype(int) 

sers = [] 
subBinBounds = [[0, .1, .5, 1],[0, .3, .6, 1],[0, .2, .7, 1],[0, .4, .6, 1], [0, .2, .5, 1]] 
for i in range(5): 
    cut = df[df['P'] == i+1] 
    subbin = pd.cut(cut['B'], subBinBounds[i], labels=range(1,4)) 
    sers.append(subbin) 

df['Q'] = pd.concat(sers) 
print (df.head(10)) 
      A   B P Q 
0 0.543405 0.778289 3 3 
1 0.278369 0.779598 2 3 
2 0.424518 0.610328 3 2 
3 0.844776 0.309000 5 2 
4 0.004719 0.697735 1 3 
5 0.121569 0.859618 1 3 
6 0.670749 0.625324 4 3 
7 0.825853 0.982408 5 3 
8 0.136707 0.976500 1 3 
9 0.575093 0.166694 3 1 
+0

는 흠, 나는 문제가 무엇인지 잘 모릅니다,하지만 난'범위를 사용하는 경우 (1, 6)'나는'IndexError 수 : range'에서리스트 인덱스를. 너는 잘된거야? – jezrael

+0

정확하게, 또한 'range (5)'를 사용할 수 있습니다. 편집 된 답변을 참조하십시오. – jezrael

+0

@feetwet - 고맙습니다. – jezrael