2 Вопрос: Как быстро скопировать значения из одного кадра данных в другой?

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хотел бы создать на моем Dataframe (Global_Dataset) новый столбец (Col_val) на основе другого Dataframe (List_Data). Мне нужен более быстрый код, потому что у меня есть набор данных из 2 миллионов выборок, а List_data содержит 50000 выборок.

Col_Val должен содержать значение столбца Value в соответствии с Col_Key

List_Data:

id     Key     Value
1       5        0
2       7        1
3       9        2

Global_Dataset:

id    Col_Key     Col_Val
1        9           2
2        5           0
3        9           2 
4        7           1
5        7           1
6        5           0
7        9           2
8        7           1
9        9           2
10       5           0

Я пробовал этот код, но для его выполнения требуется много времени. Есть ли другой более быстрый способ достижения моей цели?

Col_Val = []
for i in range (len(List_Data)):
    for j in range (len(Global_Data)):
        if List_Data.get_value(i, "Key") == Global_Data.get_value(j, 'Col_Key') :
            Col_Val.append(List_Data.get_value(i, 'Value'))

Global_Data['Col_Val'] = Col_Val

PS: я пробовал loc и iloc вместо get_value, но он работает очень медленно

    
1
2 ответа                              2                         

Попробуйте это:

data_dict = {key : value for key, value in zip(List_Data['Key'], List_Data['Value'])}
Global_Data['Col_Val'] = pd.Series([data_dict[key] for key in Global_Data['Col_Key']])

Я не знаю, сколько времени потребуется вашей машине с объемом данных, которые вам нужно обработать, но это должно быть быстрее того, что вы используете сейчас.
Вы также можете сгенерировать словарь с data_dict = {row['Key'] : row['Value'] for _, row in list_data.iterrows()}, но на моем компьютере он работает медленнее, чем я предлагал выше.

Он работает в предположении, что все ключи в Global_Data['Col_Keys'] присутствуют в List_Data['Key'], в противном случае вы получите KeyError.

    
2
2019-05-08 16: 16: 24Z
  1. + 1 от меня, вы превзошли мой ответ примерно в 6 раз! 2.94 ms для меня, 565 µs для вас по предоставленным данным
    2019-05-08 16: 24: 45Z
  2. спасибо, Валентино, они оба работают намного быстрее, чем мой код
    2019-05-08 16: 25: 01Z

Нет причин циклически проходить что-либо вручную или с помощью iterrows. Если я понимаю вашу проблему, это должен быть простой операция слияния .

df
    Key Value
id      
1   5   0
2   7   1
3   9   2

global_df
    Col_Key
   id   
1   9
2   5
3   9
4   7
5   7
6   5
7   9
8   7
9   9
10  5

global_df.reset_index()\
.merge(df, left_on='Col_Key', right_on='Key')\
.drop('Key', axis=1)\
.set_index('id')\
.sort_index()

    Col_Key Value
id      
1   9   2
2   5   0
3   9   2
4   7   1
5   7   1
6   5   0
7   9   2
8   7   1
9   9   2
10  5   0

Обратите внимание, что суть этого - global_df.merge(...), но дополнительными операциями являются сохранение исходной индексации и удаление ненужных дополнительных столбцов. Я рекомендую вам попробовать каждый шаг в отдельности, чтобы увидеть результаты.

    
3
2019-05-08 16: 20: 17Z
источник размещен Вот