Как быстро скопировать значения из одного кадра данных в другой? - PullRequest
1 голос
/ 08 мая 2019

Я хотел бы создать на моем 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, но он работает очень медленно

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Нет причин циклически проходить что-либо вручную или с помощью 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(...), но дополнительные операции должны сохранить исходную индексацию и удалить ненужные дополнительные столбцы. Я рекомендую вам попробовать каждый шаг в отдельности, чтобы увидеть результаты.

2 голосов
/ 08 мая 2019

Попробуйте:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...