2014-09-30 2 views
2

일부 배경 : 내 코드는 사용자 입력을 받아 내 DF에 적용하여 특정 행을 제거합니다. 이 프로세스는 사용자가 원하는만큼 반복됩니다.while 루프 (Python3, Pandas) 중 팬더 DF 업데이트

data = ({'hello':['the man','is a','good guy']}) 
df = pd.DataFrame(data) 

def func(): 
    while True: 
     n = input('Words: ') 
     if n == "Done": 
      break 
     elif n != "Done": 
      pattern = '^'+''.join('(?=.*{})'.format(word) for word in n.split()) 
      df[df['hello'].str.contains(pattern)==False] 

을 내가 변화 때문에 각 루프의 끝에서 DF를 업데이트하려면 어떻게 : 불행하게도, 나는 그것이 변화가 만들어지고 유지하도록 내가 만든 while 루프에서 내 DF를 업데이트하는 방법을 잘 모르겠습니다 머물러있게 만들어지는거야?

+0

사용'loc'로 func를 시작하면 func 전화를 호출 할 때 func의 끝 부분에 문제가 두

return df은 그것을 좋아합니까 : df.loc [df [ 'hello']. str.contains (pattern) == False, 'col'] = newVal' – EdChum

+0

이 코드의 작동 방식을 잘 모르시겠습니까? 괜찮 으면 조금 더 설명해 주시겠습니까? – user3682157

+0

'loc'는 라벨 기반 색인을 사용합니다. 문서를 참조하십시오 : http://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices-for-indexing-loc-iloc-and-ix – EdChum

답변

0

좋아, 나는 당신의 문제를 재평가하고 나의 오래된 대답은 당연히 틀렸다.

원하는 것은 DataFrame.drop method입니다. 이것은 내부에서 수행 할 수 있습니다.

mask = df['hello'].str.contains(pattern) 
df.drop(mask, inplace=True) 

이렇게하면 DataFrame이 업데이트됩니다.

0

이미 모든 노력을 다 했으므로 나에게는 두 가지 문제점이 있습니다.

  1. 마지막 줄에는 결과가 저장되지 않습니다. 대부분의 팬더 작업은 "현재 위치"가 아니므로 나중에 사용할 수 있도록 결과를 어딘가에 저장해야합니다.

  2. df은 전역 변수이며 명시 적으로 global df이라는 줄이없는 한 함수 내에서 값을 설정해도 작동하지 않습니다. 자세한 내용은 this question에 대한 좋은 답변을 참조하십시오.

그래서 난 그냥 할 필요가 있다고 생각 :

df = df[df['hello'].str.contains(pattern)==False] 

이 문제를 해결하기 위해.

df = func(df) 

을 OR, 라인

global df