2017-09-11 1 views
0

데이터 프레임이 원하는 크기로 줄어들 때까지 최대 합계로 열을 삭제하는 간단한 재귀 함수를 작성했습니다. 이 위의 코드에서재귀 함수의 중간 결과를 어떻게 목록에 넣으시겠습니까?

s = pd.DataFrame({'a': [1,1,1,1,1,1], 
        'b': [2,2,2,2,2,2], 
        'c': [3,3,3,3,3,3], 
        'd': [4,4,4,4,4,4], 
        'e': [5,5,5,5,5,5]}) 

def recSelect(inputdf): 
    if inputdf.shape[1]<=2: 
     return inputdf 
    else: 
     total = inputdf.sum() 
     idx = total.idxmax() 
     inputdf.drop(idx, axis=1, inplace=True) 
     return recSelect(inputdf) 

recSelect(s) 

열 'E'를 먼저 제거하고, 그 다음 열 'D', 그리고 'C': 다음 코드이다. 내 질문은 : 어떻게 제대로 'idx'를 반환하고 [ 'e', ​​'d', 'c']와 같은 목록을 얻는가 ??

는 여기에 내가 시도 무엇 그러나 그것은 작동하지 않습니다 :

idxs = [] # create an empty list 
def recSelect(inputdf): 
    if inputdf.shape[1]<=2: 
     return inputdf 
    else: 
     total = inputdf.sum() 
     idx = total.idxmax() 
     idxs.append(idx) # append each idx 
     inputdf.drop(idx, axis=1, inplace=True) 
     return recSelect(inputdf), idxs 

답변

2

는 다음과 같은 코드를 시도 할 수 있습니다 : 전역 변수를 사용하지

your_list = list() # the traking list 

s = pd.DataFrame({'a': [1,1,1,1,1,1], 
        'b': [2,2,2,2,2,2], 
        'c': [3,3,3,3,3,3], 
        'd': [4,4,4,4,4,4], 
        'e': [5,5,5,5,5,5]}) 

def recSelect(inputdf): 
    if inputdf.shape[1]<=2: 
     return inputdf 
    else: 
     total = inputdf.sum() 
     idx = total.idxmax() 
     your_list.append(idx) # append the dropped idx 
     inputdf.drop(idx, axis=1, inplace=True) 
     return recSelect(inputdf) 

recSelect(s) 
print your_list # there you go! 

출력 ['e', 'd', 'c']

+1

하, 내가 너무 가까이했다! – user3768495

3

시도를 - 당신의 재귀에서 그것을 사용하십시오! 함수에 추가 매개 변수를 추가하십시오. 제거 된 열 이름을 저장하는 목록이 필요하지만 기본값은 None으로 설정되므로 함수 호출간에 목록이 공유되지 않습니다. 첫 번째 호출에서 빈 목록을 초기화하고 열을 제거 할 때마다 업데이트하십시오.

import pandas as pd 

s = pd.DataFrame({'a': [1,1,1,1,1,1], 
        'b': [2,2,2,2,2,2], 
        'c': [3,3,3,3,3,3], 
        'd': [4,4,4,4,4,4], 
        'e': [5,5,5,5,5,5]}) 

def recSelect(inputdf, removed=None): 
    if not removed: 
     removed=[] 
    if inputdf.shape[1]<=2: 
     return inputdf, removed 
    else: 
     total = inputdf.sum() 
     idx = total.idxmax() 
     inputdf.drop(idx, axis=1, inplace=True) 
     removed.append(idx) 
     return recSelect(inputdf, removed) 

vals, removed = recSelect(s) 

print(removed) 

인쇄 당신이 합계에 의해 값을 정렬 할 수 있습니다 자신의 인덱스를 액세스 할 수있는 재귀 함수를 만들 왜 문제에 대한 나의 접근 방식과 ohk 경우

['e', 'd', 'c'] 
+1

나는 빈리스트의 디폴트 값을 사용하는 것이 remove = [] 함수가 나중에 다시 호출 될 때 문제가 될 것이라고 생각한다. 왜냐하면 그리스트는 오직 한 번만 생성되기 때문에 (이후의 호출 중에리스트는 비어 있지 않을 것이다)? http://docs.python-guide.org/ko/latest/writing/gotchas/ –

+0

@AndreasGrivas 위대한 캐치! 이것은 내가 전역 매개 변수로 피하려고했던 것과 정확히 같았습니다. 나는 그것을 직접 놓쳤습니다. 대답을 지금 업데이트했습니다 (그리고 새로운 것을 배웠습니다!). 감사합니다. – asongtoruin

+0

@asongtoruin은 전역 변수 사용을 피하는 데 어떤 이점이 있습니까? 또는 이렇게하는 것이 좋은 습관입니까? – chowsai

2

. 즉

s = pd.DataFrame({'a': [1,1,1,1,1,1], 
       'b': [2,2,2,2,2,2], 
       'c': [5,5,5,5,5,5], 
       'd': [4,4,4,4,4,4], 
       'e': [1,5,5,5,5,5]}) 

sum_order = s.sum().sort_values().index 
ndf = s[sum_order[:2]] 
li = sum_order[2:][::-1].tolist() 

출력 :

 
ndf 
    a b 
0 1 2 
1 1 2 
2 1 2 
3 1 2 
4 1 2 
5 1 2 
li 
['c', 'e', 'd'] 

팬더가 가능한 루프를 피하려고 당신은

.

+0

동의합니다. 이 코드는 내가해야 할 일을 단순화 한 것입니다.따라서 재귀를 사용해야합니다. 어쨌든 고마워! – user3768495

0

가 나는 while 루프와 더 잘 작동 생각 :

import pandas as pd 

s = pd.DataFrame({'a': [1,1,1,1,1,1], 
        'b': [2,2,2,2,2,2], 
        'c': [3,3,3,3,3,3], 
        'd': [4,4,4,4,4,4], 
        'e': [5,5,5,5,5,5]}) 

idxs = [] 

def reduce_df(df): 
    while (df.shape[1]) > 2: 
     idx = df.sum().idxmax() 
     idxs.append(idx) 
     df.drop(idx, axis=1, inplace=True) 
    print idxs 
    print df 

reduce_df(s) 
관련 문제