2017-03-14 1 views
1

itertuples() iterator 함수를 사용하여 pandas 테이블을 반복합니다. 조건이 참일 때 다른 열에 값을 설정하고 싶습니다. 그게 쉽지. 그러나 이전에 설정 한 값을 기반으로 다른 값을 다시 설정하고 싶지 않습니다. 두 번째로 반복해야하지만 비효율적입니다. 하나의 반복 프로세스 내에서 다른 열에 여러 값을 설정할 수 있습니까? 나는 가득 코멘트 열을 얻는 대신 다른 반복을 할 필요가팬더 테이블에서 한 번만 반복하여 여러 값을 설정하는 방법은 무엇입니까?

data = { 
'Animal': ['cat', 'dog', 'dog', 'cat', 'bird', 'dog', 'cow'], 
'Noise': ['muh', 'miau', 'wuff', 'piep', 'piep', 'miau', 'muh'] 
} 

df = pd.DataFrame(data) 
df.insert(loc=2, column='Match', value='') 
df.insert(loc=3, column='Comment', value='') 
for row in df.itertuples(): 
    if row.Animal == 'cat' and row.Noise == 'miau': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'dog' and row.Noise == 'wuff': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'bird' and row.Noise == 'piep': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'cow' and row.Noise == 'muh': 
     df.set_value(index=row.Index, col='Match', value=True) 

    # Why is this not getting applied to the 'Comment' column? 
    if row.Match is True: 
     df.set_value(index=row.Index, col='Comment', value='yeah') 

: 여기

몇 가지 예제 코드입니다

for row in df.itertuples(): 
    if row.Match is True: 
     df.set_value(index=row.Index, col='Comment', value='yeah') 

그러나 즉 500000+ 값이 매우 비효율적이며, 시간이 많이 걸린다. 그런 식으로하는 더 좋은 방법은 무엇일까요?

+0

왜 같은 루프에서 사용하지 않습니까? 항상 같은 시간에 설정하는 것 같습니다 – marisbest2

+0

또한 하나의 조건부를 사용하고 '또는'을 사용하는 것을 고려하십시오. 그런 식으로 반복 코드 – marisbest2

+0

을 반복 할 필요가 없습니다. 동일한 루프에서 작동하지 않기 때문입니다. 이것은 정확히 같은 루프에서 불가능한 이유입니다. ;-) – qfactor

답변

1

고려하여 내가 일치가 무엇인지 정의하는 초기에 계산 된 사전을 사용하십시오 df

data = { 
'Animal': ['cat', 'dog', 'dog', 'cat', 'bird', 'dog', 'cow'], 
'Noise': ['muh', 'miau', 'wuff', 'piep', 'piep', 'miau', 'muh'] 
} 

df = pd.DataFrame(data) 

. 그런 다음 변환하고 동등성을 테스트하려면 map을 사용하십시오. 그 후, 원하는 열을 생성하려면 assign을 사용합니다. 루프 내에서
귀하의 row 더 이상 dataframe에 부착되어


matches = dict(cat='miau', dog='wuff', bird='piep', cow='muh') 

match = df.Animal.map(matches) == df.Noise 

df.assign(Match=match, Comment=np.where(match, 'yeah', '')) 

    Animal Noise Match Comment 
0 cat muh False   
1 dog miau False   
2 dog wuff True yeah 
3 cat piep False   
4 bird piep True yeah 
5 dog miau False   
6 cow muh True yeah 

는 특정 질문에 대답합니다. 따라서 True 또는 Falseset_value으로 데이터 프레임에 할당하면 row에서 설정 한 값에 액세스 할 수 없습니다. 대신, for 루프 후이 사용할 수 df.get_value

for row in df.itertuples(): 
    if row.Animal == 'cat' and row.Noise == 'miau': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'dog' and row.Noise == 'wuff': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'bird' and row.Noise == 'piep': 
     df.set_value(index=row.Index, col='Match', value=True) 
    elif row.Animal == 'cow' and row.Noise == 'muh': 
     df.set_value(index=row.Index, col='Match', value=True) 

    # This should work 
    if df.get_value(index=row.Index, col='Match') is True: 
     df.set_value(index=row.Index, col='Comment', value='yeah') 
+0

이 예제는 필자가 한 것처럼 "Match"와 "Comment"- Column을 채울 수있는보다 우아한 방법입니다. '지도'와 '배정'에 대해 들어 본 적이 없습니다. 그 아이디어에 감사드립니다. 어쨌든 질문의 초점은 하나의 루프 내에서 여러 열/셀을 채우는 방법입니다. – qfactor

+0

'Match'-Column이 다른 컬럼들로부터 더 복잡한 방식으로 계산된다고 상상해보십시오. itertuples 루프 내에서 True/False 결과를 계산하고 다른 셀을 채우고 그 결과에 따라 다른 열의 다른 셀을 기반으로하는 결과를 기반으로합니다. 그러나 나는 모든 결과에 대해 다시 반복하고 싶지 않습니다. 대신 하나의 루프 내에서 모든 계단식 계산을 수행하는 것이 좋습니다. – qfactor

+0

@qfactor 업데이트보기 – piRSquared

0

대신

# Why is this not getting applied to the 'Comment' column? 
    if row.Match is True: 
     df.set_value(index=row.Index, col='Comment', value='yeah') 

의 사용합니다.

df['Comment'] = df['Match'].apply(lambda x: 'yeah' if x == True else '') 
관련 문제