2017-12-24 6 views
2

if x in y 문을 실행할 때 ValueError를 던지는 팬더에서 실행중인 작은 함수가 있습니다. 부울 인덱싱, .isin()where()을 추천하는 비슷한 소리가 나는 문제를 봤지만 어떤 경우 든 내 사례에 적용 할 수 없었습니다. 어떤 조언을 주시면 감사하겠습니다.팬더 : 반복 루프의 대안

추가 참고 : groups은 데이터 프레임 외부의 문자열을 포함하는 목록입니다. 이 함수의 목표는 데이터 프레임의 항목이 어느 목록에 있는지 확인한 다음 해당 목록의 색인을 반환하는 것입니다. 아래의 노트 링크에있는이 첫 번째 버전은 iterrows을 사용하여 데이터 프레임을 반복하지만, 대부분의 경우 최적 이하임을 이해합니다. 일부 가짜 데이터

Jupyter 노트북 : https://github.com/amoebahlan61/sturdy-chainsaw/blob/master/Grouping%20Test_1.1.ipynb

감사합니다!

코드 :

def groupFinder(item): 
    for group in groups: 
     if item in group: 
      return groups.index(group) 

df['groupID2'] = groupFinder(df['item']) 


--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-16-808ac3e51e1f> in <module>() 
     4    return groups.index(group) 
     5 
----> 6 df['groupID2'] = groupFinder(df['item']) 

<ipython-input-16-808ac3e51e1f> in groupFinder(item) 
     1 def groupFinder(item): 
     2  for group in groups: 
----> 3   if item in group: 
     4    return groups.index(group) 
     5 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self) 
    953   raise ValueError("The truth value of a {0} is ambiguous. " 
    954       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 955       .format(self.__class__.__name__)) 
    956 
    957  __bool__ = __nonzero__ 

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

솔루션 좀 팬더의 블로그 게시물을 가로 질러 와서도 나에게 'apply 기능을 판다를 사용하여 iterrows를 사용하여 건너 뜁니다 솔루션을 준 레딧 사용자로부터 어떤 피드백을 얻었다.

df['groupID2'] = df.item.apply(groupFinder) 

여러분의 도움과 의견에 감사드립니다.

+0

일반적으로 질문에 데이터에 대한 링크를 포함하는 것은 좋지 않습니다. 링크가 죽을 수도 있고, 또 다른 경우에는 도움이 될 수도 있습니다. 이 경우 URL * 문자열을 브라우저로 복사해도 링크는 * 노트 *로 이동하지 않습니다. 질문을 참조로 사용할 수있는 다른 사람들의 이익을 위해 예제 데이터와 설정을 [최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/) 게시물의 텍스트로 옮기는 것을 고려하십시오. mcve). –

+0

@andrew_reece 질문 및 코드 예의에 감사드립니다. 앞으로도 계속 사용할 것입니다. –

답변

0

isin을 사용하는 방법은 먼저 Series.isin(...)을 호출하여 부울 마스크를 만든 다음이 마스크를 사용하여 색인을 생성하는 것입니다. 또는 시리즈 대신 목록에서 기능을 사용하려면 groupFinder(df['item'].values)으로 전화 할 수 있습니다.

0

IIUC, 당신은 팬더 사용하여 단 몇 줄에 당신이 원하는 것을 할 수 있습니다 : 이제

import pandas as pd 

# create master list of items 
master = pd.Series(legumesGroup + herbGroup + radishGroup) 

# assign group id as index 
master.index = [0]*len(legumesGroup) + [1]*len(herbGroup) + [2]*len(radishGroup) 

# sample from master with replacement to get itemList 
itemList = master.sample(n=1000, replace=True) 

을 그룹 ID 플러스 항목을 볼 수 itemList의 각 항목에 어느 itemList를 호출하는 그룹을 얻기 위해, 또는 단지 itemList.index.

itemList.head() 

는 출력 :

2  Horseradish 
2   Rutabaga 
2    Turnip 
0   Chickpeas 
0  Pinto beans 
+0

이것은 정말 흥미로운 해결책입니다. 그룹 항목에 인덱스 값을 추가하는 것에 대해 생각해 본적이 없습니다. 감사! –

0

솔루션

좀 팬더의 블로그 게시물을 가로 질러 와서도 나에게 사용하여 iterrows를 사용하여 생략 솔루션을 준 레딧 사용자로부터 어떤 의견을 가지고 팬더 '적용 기능.

df['groupID2'] = df.item.apply(groupFinder) 

여러분의 도움과 의견에 감사드립니다.