Python 3 Pandas быстрый поиск в словаре для столбца - PullRequest
1 голос
/ 13 февраля 2020

У меня есть Pandas DataFrame, где мне нужно добавить новые столбцы данных из словарей поиска. Я ищу самый быстрый способ сделать это. У меня есть способ, который работает с использованием DataFrame.map() с лямбдой, но я хотел знать, была ли это лучшая практика и лучшая производительность, которую я мог достичь. Я привык работать с R и превосходной data.table библиотекой. Я работаю над ноутбуком Jupyter, который позволяет мне использовать %time в последней строке. Вот что у меня есть:

import numpy as np
import pandas as pd

np.random.seed(123)
num_samples = 100_000_000

ids = np.arange(0, num_samples)
states = ['Oregon', 'Michigan']
cities = ['Portland', 'Detroit']

state_data = {
    0:{'Name': 'Oregon', 'mean': 100, 'std_dev': 5},
    1:{'Name': 'Michigan', 'mean':90, 'std_dev': 8}
}

city_data = {
    0:{'Name': 'Portland', 'mean': 8, 'std_dev':3},
    1:{'Name': 'Detroit','mean': 4, 'std_dev':3}
}

state_df = pd.DataFrame.from_dict(state_data,orient='index')
print(state_df)

city_df = pd.DataFrame.from_dict(city_data,orient='index')
print(city_df)

sample_df = pd.DataFrame({'id':ids})
sample_df['state_id'] = np.random.randint(0, 2, num_samples)
sample_df['city_id'] = np.random.randint(0, 2, num_samples)
%time sample_df['state_mean'] = sample_df['state_id'].map(state_data).map(lambda x : x['mean'])

Последняя строка - это то, на чем я больше всего сосредоточен. Спасибо за любую помощь! :)

Я также попробовал следующее, но не увидел существенного различия в производительности:

%time sample_df['state_mean'] = sample_df['state_id'].map(lambda x : state_data[x]['mean'])

В конечном итоге я хочу получить sample_df, чтобы иметь столбцы для каждого из штатов и городов , Таким образом, у меня будут следующие столбцы в таблице:

id | state | state_mean | state_std_dev | city | city_mean | city_std_dev

1 Ответ

1 голос
/ 13 февраля 2020

Используйте DataFrame.join, если хотите добавить все столбцы:

sample_df = sample_df.join(state_df,on = 'state_id')


#        id  state_id  city_id      Name  mean  std_dev
#0        0         0        0    Oregon   100        5
#1        1         1        1  Michigan    90        8
#2        2         0        0    Oregon   100        5
#3        3         0        0    Oregon   100        5
#4        4         0        0    Oregon   100        5
#...    ...       ...      ...       ...   ...      ...
#9995  9995         1        0  Michigan    90        8
#9996  9996         1        1  Michigan    90        8
#9997  9997         0        1    Oregon   100        5
#9998  9998         1        1  Michigan    90        8
#9999  9999         1        0  Michigan    90        8

для одного столбца

sample_df['state_mean'] = sample_df['state_id'].map(state_df['mean'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...