2016-10-19 4 views
1

나는이 같은 dataframe 가지고 함수 return_something(pref)을 사용하여 각 행의 색인 지금은 구현이 다음과 같이 : 다음 나에게 원하는 출력을 제공한다는가장 효율적인 방법은

import pandas as pd 
import numpy as np 

# this just returns a random value for the sake of simplicity 
def return_something(pref): 

    return np.random.choice(len(pref)+10) 


df = pd.DataFrame(index=['pre1_xyz', 'pre1_foo', 'pre3_bar', 'pre3_foo', 'pre10_foo', 'pre10_bar', 'pre10_xyz']) 

# get all the unique prefixes 
unique_pref = set([pi.partition('_')[0] for pi in df.index]) 

# determine the value for each prefix 
val_pref = {pref: return_something(pref) for pref in unique_pref} 

# add the values to the dataframe 
for prefi, vali in val_pref.items(): 

    # determine all rows with the same prefix 
    rows = [rowi for rowi in df.index if rowi.startswith(prefi+'_')] 

    df.loc[rows, 'values'] = vali 

:

  values 
pre1_xyz  0 
pre1_foo  0 
pre3_bar  7 
pre3_foo  7 
pre10_foo  13 
pre10_bar  13 
pre10_xyz  13 

질문은 무엇이든이, 예를 들어보다 똑똑 존재 여부 unique_pref 및/또는 val_pref을 생성하지 않고 this question에서 논의 된 것처럼 데이터 프레임에 값을 추가하는 가장 빠른 솔루션 인 것처럼 보이는 set_value을 사용하는 솔루션입니다.

답변

3

접두어가 반복되어 있으므로 동일한 접두사에 대해 새로운 임의 번호를 생성하지 않도록 먼저 접두어를 분리해야합니다. 따라서 접두사 목록에서 중복 제거가 필요합니다. 접두사를 새 열로 만든 다음 df.prefix.unique()를 사용하여 좀 더 압축 된 방식으로이 작업을 수행했습니다.

df['prefix'] = [i.split('_')[0] for i in df.index] 
df['values'] = df.prefix.map(dict(zip(df.prefix.unique(),[return_something(i) for i in df.prefix.unique()]))) 
+0

잘 작동합니다. 위로 upvoted. – Cleb

+0

@ 클리블은 문제를 해결 한 경우 답변으로 표시하는 것을 고려합니다. – piRSquared

+0

@ piRSquared : 나는 더 나은 것이 나타나지 않으면, 할 것이다. 때로는 더 나은 해결책이 나오기 때문에 나는 보통 받아 들일 때까지 잠시 기다린다. 내 프로필을 보면, (좋은) 답변이 있으면 항상 대답을 수락한다는 것을 알 수 있습니다. – Cleb

관련 문제