#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. Да, не могли бы вы показать образец? Действительно трудно даже понять точную проблему, не видя данных.