Заполните пропущенные значения по группам в панд

#pandas

#панды

Вопрос:

У меня есть пара кадров данных.

df1 имеет колонки Company , и ProductID . В этом фрейме данных есть только один productID на компанию.

df2 имеет колонки CompanyID и ProductID . Может быть несколько productID s на каждого companyID , и несколько companyID s могут соответствовать одной и той же компании.

df2 имеет гораздо больше productID s, чем df1 . Я хочу назначить компанию каждому productID из них .

Есть ли способ назначить компанию каждому идентификатору компании, а затем назначить эту компанию каждому другому идентификатору продукта, принадлежащему этой компании?

Например:

 data1 = {'Company' : ['Company 1', 'Company 1', 'Company 2', 'Company 3', 'Company 4', 'Company 5'],  'ProductID' : ['ASG1', 'HDS8', 'BHF5', 'VHJ4', 'LKH6', 'LKD4']}  data2 = {'CompanyID' : ['C1', 'C1', 'C1a', 'C2', 'C1', 'C3', 'C3', 'C4', 'C1', 'C5', 'C5', 'C4', 'C2'], 'ProductID' : ['ASG1', 'FHJ5', 'HDS8', 'BHF5', 'CCD4', 'KKL4', 'VHJ4', 'LKH6', 'CBN1', 'MNZ2', 'LKD4', 'LMJ1', 'XXC1']}  outputdata = {'CompanyID' : ['C1', 'C1', 'C1a', 'C2', 'C1', 'C3', 'C3', 'C4', 'C1', 'C5', 'C5', 'C4', 'C2'], 'ProductID' : ['ASG1', 'FHJ5', 'HDS8', 'BHF5', 'CCD4', 'KKL4', 'VHJ4', 'LKH6', 'CBN1', 'MNZ2', 'LKD4', 'LMJ1', 'XXC1'], 'Company' : ['Company 1', 'Company 1', 'Company 1', 'Company 2', 'Company 1', 'Company 3', 'Company 3', 'Company 4', 'Company 1', 'Company 5', 'Company 5', 'Company 4', 'Company 2']}   df1 = pd.DataFrame(data=data1) df2 = pd.DataFrame(data=data2) outputdf = pd.DataFrame(data=outputdata)  

Буквы companyID s на самом деле не так информативны, как в этом примере, поэтому для их сопоставления необходимы оба кадра данных.

Редактировать: Я добавил пример того, как должен выглядеть вывод (outputdf).

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

1. Когда я пытаюсь запустить ваш код, я получаю сообщение об ошибке: ValueError: All arrays must be of the same length . Не могли бы вы это исправить, пожалуйста?

2. @user17242583 Извините — пропущена запятая. Теперь это работает. (Также обратите внимание на небольшое изменение в одном из идентификаторов компании)

3. Не могли бы вы добавить фрейм данных, содержащий ваш ожидаемый результат? Это очень помогло бы визуализировать это.

4. @user17242583 Еще раз приношу свои извинения! Добавлено сейчас.

Ответ №1:

Вы можете объединить ProductID , а затем заполнить все наиболее распространенным значением для каждого CompanyID :

 df2['Company'] = df2.merge(df1, how='outer', left_on='ProductID', right_on='ProductID').groupby('CompanyID')['Company'].transform(lambda x: x.mode()[0])  

Выход:

 gt;gt;gt; df2  CompanyID ProductID Company 0 C1 ASG1 Company 1 1 C1 FHJ5 Company 1 2 C1a HDS8 Company 1 3 C2 BHF5 Company 2 4 C1 CCD4 Company 1 5 C3 KKL4 Company 3 6 C3 VHJ4 Company 3 7 C4 LKH6 Company 4 8 C1 CBN1 Company 1 9 C5 MNZ2 Company 5 10 C5 LKD4 Company 5 11 C4 LMJ1 Company 4 12 C2 XXC1 Company 2  

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

1. Это работает в данном примере, но, к сожалению, не работает с моим фактическим набором данных (возможно, потому, что некоторые группы могут содержать только значения NaN в столбце Идентификатор компании). Есть ли способ справиться с этим? Я понимаю, что, возможно, невозможно ответить без примера набора данных, который воспроизводит эту проблему.

2. Да, не могли бы вы показать образец? Действительно трудно даже понять точную проблему, не видя данных.