Как подтянуть данные из DF Pandas (Выбор столбца ВПР Excel)
Такой вопрос: Есть пара 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)
В экселе вопрос одного символа в формуле, а тут...
Ответы (2 шт):
Для решения можно создать функцию(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().
Ну да, можно использовать 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 Масло