2016-10-05 2 views
0

У меня есть следующие DFПанды - Self ссылка экземпляров в столбце

SampleID ParentID 
0 S10  S20  
1 S10  S30  
2 S20  S40  
3 S30    
4 S40  

Как я могу поставить идентификатор из другой строки в столбце «ParentID» вместо строки?

Ожидаемый результат:

SampleID ParentID 
0 S10  2  
1 S10  3  
2 S20  4 
3 S30    
4 S40    

Ближайший результат я нашел для этой проблемы было: How to self-reference column in pandas Data Frame?

+0

что вы пробовали? проверьте http://pandas.pydata.org/pandas-docs/stable/text.html – acushner

+0

Я не хочу заменять строку каким-либо текстом. Я попытался сбросить индекс в 'SampleID' и использовать' df.loc [ParentID] ', но тогда я не смог получить предыдущий идентификатор – mk2

ответ

2

Я думаю, что вы можете использовать merge, а затем назначить столбец index:

df1 = pd.merge(df[['SampleID']].reset_index(), 
       df[['ParentID']], 
       left_on='SampleID', 
       right_on='ParentID') 
print (df1) 
    index SampleID ParentID 
0  2  S20  S20 
1  3  S30  S30 
2  4  S40  S40 

df['ParentID'] = df1['index'] 
df.fillna('', inplace=True) 
print (df) 
    SampleID ParentID 
0  S10  2 
1  S10  3 
2  S20  4 
3  S30   
4  S40  

A ругой решение с map и dict где ключи свопа со значениями:

d = dict((v,k) for k,v in df.SampleID.iteritems()) 
print (d) 
{'S10': 1, 'S40': 4, 'S20': 2, 'S30': 3} 

df.ParentID = df.ParentID.map(d) 
df.ParentID.fillna('', inplace=True) 
print (df) 
    SampleID ParentID 
0  S10  2 
1  S10  3 
2  S20  4 
3  S30   
4  S40   
+0

. Мне очень понравилась карта! Я использую много javascript, и я использовал некоторую карту/сокращение для школьных проектов для «больших данных», а картография - обычная практика. По этой причине это кажется мне более ясным, хотя слияние также ясно. Большое спасибо! – mk2

1

Использование replace путем передачи по спискам отображения значений для замены:

df.ParentID.replace(df.SampleID.tolist(), df.index.tolist(), inplace=True) 

df 
Out[22]: 
    SampleID ParentID 
0  S10  2.0 
1  S10  3.0 
2  S20  4.0 
3  S30  NaN 
4  S40  NaN 
+0

Это не сработало. Это дало ошибку, говоря о сравнении строк и ndarray 'TypeError: Невозможно сравнить типы« ndarray (dtype = float64) »и« str » ' – mk2

+1

, это на месте, поэтому, если вы запускаете его дважды, вы, скорее всего, получите немой ответ во второй раз потому что отображение уже сделано – Boud

+0

Это правда. Я снова прочитал файл csv, и он не выдал ошибку. Тем не менее, это выглядит намного медленнее. Он работает некоторое время и ответа пока нет. Я думаю, что преобразование .tolist() - это то, что замедляет процесс – mk2

Смежные вопросы