Панды: переиндексация действительна только для объектов индекса с уникальным значением - PullRequest
0 голосов
/ 06 ноября 2018

Имеют следующие два набора данных в python 2.7:

df1:

D_ID        D_NBR   D_ID    D_HR_LVL
851669006   8383    93433   IT
260969003   7337    83189   CORP
7383        8300    72521   FIN
260969003   6262    66611   No Data
919832001   22922   90111   IT
749277000   81123   53621   FIN
3353        6363    99931   No Data

df2:

U_ID        U_NBR
851669006   851669
749277000   749277
749838000   788363
919832001   919832
260969003   260969

Requiremnt:

if df1.D_HR_LVL == 'IT'
    then get df2.U_NBR using df2.U_ID 
elif df1.D_HR_LVL == 'FIN'
    then split df2.U_NBR in 3 and 2 digits
else
    keep the things as it is

Пробовал:

a1 = df1.D_ID.astype(str).where(df1.D_HR_LVL.eq("IT"))
a2 = df1.D_ID.map(df2.set_index('U_ID').U_NBR.astype(str))
ncol = (df1.D_ID.astype(str).str.extract(r'(\d{3})(\d+)').where(df1.D_HR_LVL.eq("FIN")).rename(columns=lambda x: 'N_COL{}'.format(x+1)))

mer_df = pd.concat([df1,a1,a2,ncol],axis=1)

но получаю ошибку:

InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Цель состоит в том, чтобы получить следующую O / P:

new_df:

D_ID        D_NBR   D_ID    D_HR_LVL  U_NBR     N_Col_1     N_Col_2
851669006   8383    93433   IT        851669
260969003   7337    83189   CORP      
7383        8300    72521   FIN
260969003   6262    66611   No Data
919832001   22922   90111   IT        919832
749277000   81123   53621   FIN       749277    749         27
3353        6363    99931   No Data

Любая конструктивная помощь / предложение очень заметна.

1 Ответ

0 голосов
/ 06 ноября 2018

Ошибка может быть связана с тем, что у вас есть 2 столбца с именем 'D_ID' в df1. Если вы переименуете их, например, с помощью df1.columns = [u'D_ID', u'D_NBR', u'D_ID2', u'D_HR_LVL'], ваша программа запустится, но не даст желаемого результата.

Вот еще один способ, вы можете сделать это, сначала объединив df1 с df2 по всем идентификаторам commum, а затем измените значения в соответствии с вашими требованиями, например:

df1.columns = [u'D_ID', u'D_NBR', u'D_ID2', u'D_HR_LVL']
mer_df = df1.merge(df2.rename(columns={'U_ID':'D_ID'}),how='left').fillna('')

#requirement else: looking for values in D_HR_LVL not IT or FIN and erase them 
mer_df.loc[~mer_df.D_HR_LVL.isin(['IT','FIN']),'U_NBR'] = ''

#create the column N_Col_1 and N_Col_2
mask_FIN = (mer_df.D_HR_LVL=='FIN') & (mer_df.U_NBR != '') #mask to select the rows
mer_df.loc[mask_FIN,'N_Col_1'] = mer_df.loc[mask_FIN,'D_ID'].astype(str).str[:3]
mer_df.loc[mask_FIN,'N_Col_2'] = mer_df.loc[mask_FIN,'D_ID'].astype(str).str[3:5]

# fillna
mer_df = mer_df.fillna('')

print (mer_df)
        D_ID  D_NBR  D_ID2 D_HR_LVL   U_NBR N_Col_1 N_Col_2
0  851669006   8383  93433       IT  851669                
1  260969003   7337  83189     CORP                        
2       7383   8300  72521      FIN                        
3  260969003   6262  66611  No Data                        
4  919832001  22922  90111       IT  919832                
5  749277000  81123  53621      FIN  749277     749      27
6       3353   6363  99931  No Data                        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...