Как я могу создать НОВЫЙ столбец в фрейме данных на основе значений другого столбца в ДРУГОМ фрейме данных, которые содержат общую информацию?

#python #pandas #dataframe #variable-assignment #multi-index

Вопрос:

У меня есть фрейм данных:

Это для работы, поэтому я просто собираюсь упростить ее и вложить в нее минимальный объем данных, я называю это данными:

 | induction date |    shop        |
| -------------- | -------------- |
|2021-07-18      | AD9            |
| 2021-07-26     | DL9            |
 

Я хочу добавить третий столбец под названием НЗП, который захватывает НЗП из другого кадра данных (мультииндексный) этого формата на основе сопоставления даты введения и МАГАЗИНА, я называю этот НЗП:

                                   |  WIP  |
                                  |-------|
| date           |    shop        |       |
| -------------- | -------------- |       |
| 2021-07-18     | AD9            |   7   |
| 2021-07-26     | DL9            |   3   |
 

Хотя мне не повезло, я попытался преобразовать фрейм данных WIP в словарь и использовать карту, но это не работает, я получаю ключевую ошибку. Я не знаю, из-за многоуровневого индекса или из-за чего, но я застрял.

Я также попытался просто назначить его, сославшись на фрейм данных WIP и исходные столбцы, такие как:

 data['WIP']=WIPbyShop.loc[data['DATE_INDUCTED', 'SHOP']].WIP
 

но это дает мне ключевую ошибку. Любые идеи/предложения будут высоко оценены! Я чувствую, что должен быть довольно простой способ сделать это, и как будто я перестал усложнять это.

Ответ №1:

Мы можем попробовать join указать аргумент on ключевого слова, чтобы указать ему выравнивание мультииндекса по столбцам в data :

 data = data.join(WIPbyShop['WIP'], on=['induction date', 'shop'])
 

data :

   induction date shop  WIP
0     2021-07-18  AD9    7
1     2021-07-26  DL9    3
 

Установка:

 import pandas as pd

data = pd.DataFrame({
    'induction date': ['2021-07-18', '2021-07-26'], 
    'shop': ['AD9', 'DL9']
})

# Reversed DataFrame rows to show alignment
WIPbyShop = pd.DataFrame({
    'date': ['2021-07-26', '2021-07-18'], 
    'shop': ['DL9', 'AD9'],
    'WIP': [3, 7]
}).set_index(['date', 'shop'])
 
 # data
  induction date shop
0     2021-07-18  AD9
1     2021-07-26  DL9

# WIPbyShop
                 WIP
date       shop     
2021-07-26 DL9     3
2021-07-18 AD9     7
 

Комментарии:

1. Спасибо за быстрый ответ, но это дало: Ошибка значения: вы пытаетесь объединить столбцы datetime64[ns] и объект. Если вы хотите продолжить, вам следует использовать pd.concat

2. Один из ваших столбцов даты-это дата-время, а другой-строка. Вы должны сделать их либо строковыми, либо обоими датами.

3. Нет, они оба датированы временем, я просто дважды проверил.

4. Этого не может быть, если вы получаете сообщение об ошибке, в котором говорится, что один является объектом, а другой-datetime64[ns]

5. Хорошо, вы правы, я добавил дополнительную строку, используя pd.to_datetime для столбца даты НЗП, и это устранило проблему, и теперь это работает. Спасибо вам за быстрый ответ!