Использование красивого супового словаря для замены символов в pandas dataframe - PullRequest
0 голосов
/ 30 апреля 2020

Я создаю python словарь с beautifulsoup, преобразуя URL-адрес в xml следующим образом:

from bs4 import BeautifulSoup

url = "http://api.brain-map.org/api/v2/data/query.xml?num_rows=10000&start_row=10001&&criteria=model::Gene,rma::criteria,products[abbreviation$eq%27Mouse%27]"

req = requests.get(url)

doc = req.text
root = etree.XML(doc)
soup = BeautifulSoup(doc)

final_dictionary1 = {}

for object in soup.find_all('object'):
    final_dictionary1[object.find('id').string] = object.find('acronym').string

Тогда я получил bs4.element.NavigableString. Там у меня есть несколько идентификаторов, которые имеют соответствующее имя, например:

'20174': 'Ruvbl2',
'71833': 'Dcaf7',

Теперь я хочу заменить столбец в моем фрейме данных df, который содержит эти идентификаторы с соответствующим именем.

Я пытался:

df["GeneID"] = df["GeneID"].map(final_dictionary1)

##or
final_dictionary2=str.join(u'\n',map(str,final_dictionary1))

df["GeneID"] = df["GeneID"].map(final_dictionary2)

##df looks like:
df

Out[28]: 
                :  Region     GeneID  DistanceValue
0                      BG   79677107            0.0
1                      BG   71920480            0.0
2                      BG   77869780            0.0
3                      BG   69838736            0.0
4                      BG  100145371            0.0
            ...    ...        ...            ...

Оба выдают ошибку:

AttributeError: Can only use .str accessor with string values!

Затем я проверил тип моего df ['GeneID'], который был dtype ('int64'), тогда я сделал

df['GeneID'] = df['GeneID'].astype(str)
#with output
df['GeneID'].dtypes
Out[31]: dtype('0')

Тем не менее я получаю ту же ошибку.

1 Ответ

0 голосов
/ 30 апреля 2020

Передайте словарь пар ключей-значений python методу pandas.Series.map, чтобы заменить каждое значение в столбце на пару значений словаря. Например:

import pandas as pd
#make a python dictionary of key value pairs
foo = {'foo': 33, 'bar': 99}
#create a pandas Dataframe with two rows.
df = pd.DataFrame({'mycolumn':['foo','bar']})
print(df['mycolumn'])

df['mycolumn'] = df['mycolumn'].astype(str).map(foo)
print(df['mycolumn'])

Отпечатки:

0    foo
1    bar
Name: mycolumn, dtype: object

0    33
1    99
Name: mycolumn, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...