У меня есть 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