Как подтянуть данные из DF Pandas (Выбор столбца ВПР Excel)

Рейтинг: 1Ответов: 2Опубликовано: 20.05.2023

Такой вопрос: Есть пара df (в примере столбцы упразднены) нужно на выходе получить значение следующего столбца от анализируемого. Пример:

import pandas as pd
df1 = pd.DataFrame({'Имя': ['Стейк свинной', 'Говядина тушеная', 'Масло сливочное','Шейка свинная', 'Масло подсолнечное нерафинированное', 'Масло подсолнечное рафинированное'],
 'points': [4, 4, 6, 8, 9, 10]})
df2 = pd.DataFrame({'team_name': ['Стейк', 'свинная', 'Говядина', 'сливочное', 'подсолнечное'],
  'rebounds': ['Мясо', 'Мясо','Мясо','Масло','Масло'],'points': ['q', 'w','e','r','t']})


df1['A'] = df1["Имя"].str.extract('('+'|'.join(list(df2["team_name"])) + ')')
print(df1)

На выходе мы получаем:

                                   Имя  points             A
0                        Стейк свинной       4         Стейк
1                     Говядина тушеная       4      Говядина
2                      Масло сливочное       6     сливочное
3                        Шейка свинная       8       свинная
4  Масло подсолнечное нерафинированное       9  подсолнечное
5    Масло подсолнечное рафинированное      10  подсолнечное

а нужно получить:

                                   Имя  points             A
0                        Стейк свинной       4         Мясо
1                     Говядина тушеная       4         Мясо
2                      Масло сливочное       6         Мясо
3                        Шейка свинная       8         Мясо
4  Масло подсолнечное нерафинированное       9         Масло
5    Масло подсолнечное рафинированное      10         Масло
  • есть подозрение что нужно думать в сторону .merge, но выплывают ошибки:
ValueError: Expected a 1D array, got an array with shape (87297, 15)

В экселе вопрос одного символа в формуле, а тут...

Ответы

▲ 1

Для решения можно создать функцию(typo), которая будет проверять значение столбца Имя и на его основе давать значение столбцу А:

import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Имя': ['Стейк свинной', 'Говядина тушеная', 'Масло сливочное','Шейка свинная', 'Масло подсолнечное нерафинированное', 'Масло подсолнечное рафинированное'],
 'points': [4, 4, 6, 8, 9, 10]})
df2 = pd.DataFrame({'team_name': ['Стейк', 'свинная', 'Говядина', 'сливочное', 'подсолнечное'],
  'rebounds': ['Мясо', 'Мясо','Мясо','Масло','Масло'],'points': ['q', 'w','e','r','t']})

def typo(i):
    if i in ['Стейк свинной', 'Говядина тушеная', 'Шейка свинная']:
        return 'Мясо'
    elif i in ['Масло сливочное', 'Масло подсолнечное нерафинированное', 'Масло подсолнечное рафинированное']:
        return 'Масло'


df1['A'] = np.vectorize(typo)(df1['Имя'])
print(df1)

Так как я не знаю все ли это типы, то функцию можно изменять, добавляя новые группы значений Имя и значение для этих групп в столбце А, так же здесь используется векторизация, тк я не знаю размер исходного датафрейма, а векторизация ускорит выполнение и будет быстрее чем тот же метод .apply().

▲ 1

Ну да, можно использовать merge

import pandas as pd
df1 = pd.DataFrame({'Имя': ['Стейк свинной', 'Говядина тушеная', 'Масло сливочное', 'Шейка свинная',
                            'Масло подсолнечное нерафинированное', 'Масло подсолнечное рафинированное'],
                    'points': [4, 4, 6, 8, 9, 10]})
df2 = pd.DataFrame({'team_name': ['Стейк', 'свинная', 'Говядина', 'сливочное', 'подсолнечное'],
                    'rebounds': ['Мясо', 'Мясо', 'Мясо', 'Масло', 'Масло'], 'points': ['q', 'w', 'e', 'r', 't']})

df1['A'] = df1["Имя"].str.extract('(' + '|'.join(list(df2["team_name"])) + ')').merge(df2, left_on=0, right_on='team_name')['rebounds']
print(df1)
                                   Имя  points      A
0                        Стейк свинной       4   Мясо
1                     Говядина тушеная       4   Мясо
2                      Масло сливочное       6  Масло
3                        Шейка свинная       8   Мясо
4  Масло подсолнечное нерафинированное       9  Масло
5    Масло подсолнечное рафинированное      10  Масло