Concat Pandas Dataframe на основе столбца [дубликат]

Спасибо, @ 13ren, за ваш «beep»:)

Это длинный комментарий, а не ответ. Я начну с моего более раннего обмена с 13ren, more precise, it provides to a user all that is needed to define such an analysis model.. Я имел в виду, что в QTAssistant ( этот ) мы имеем функцию сравнения XSD; будучи XSD-осведомленным, у него уже много чего не может сделать текстовый или XML-инструмент diff (например, все равно, сколько XSD-файлов, их макет изменяется между версиями и т. д.). Для предоставленного пользовательского интерфейса, двигатель дифференциала работает против исходной модели, а не PSVI. Мы могли бы настроить его вместо использования PSVI, поскольку последний на один шаг ближе к тому, что вам действительно нужно. Мы могли бы также включить возможность создания настраиваемого набора правил, дополняющего сравнение между «базой» и «ревизией», другими словами, чтобы позволить пользователю переопределить оператор «=», который мы в настоящее время используем.

Я признаю, что у нас нет ничего из коробки, позволяющего переопределить сравнение фассов xsd: pattern; ни для чего-то, что человеку легко распознать, например xsd:positiveInteger vs. xsd:integer + xsd:minInclusive=1. Или сравнивая xsd:all с xsd:choice или xsd:sequence; и для этого мы не разбираем селекторов и полей для ограничений XSD, которые, как и регулярные выражения, нелегко справиться.

Предполагая, что цель состоит в том, чтобы найти как можно больше «несоответствий», а не полностью исключать их, QTAssistant имеет еще три функции:

  • для данный корневой элемент, он создает полный список простых XPath. Его можно применять как быстрый способ определить данные «изгоев». Из этого метода сравнения этот метод сравнения не учитывает структурные шаблоны, т. Е. Если XPath1 и XPath2 обозначают двух братьев и сестер в экземпляре XML, то XPath1 должен предшествовать XPath2) и т. Д.
  • Он поставляется с встроенный в Query XSD Analyzer . SQL можно использовать для запроса метамодели XSD набора, чтобы «обнаружить» вещи, указывающие на то, что инструмент сравнения может быть спроектирован для игнорирования (для выполнимости) и поэтому потребует отчета для человека. Рефакторинг XSD (XSR). Это единственный движок в отрасли (который я знаю, по крайней мере), который построен с нуля с использованием рефакторинга и анализа XSD. Я бы подумал, что если вы можете исключить xsi: type и, в идеале, использование подстановочных групп (на этом я еще должен подумать), мы могли бы сделать доступным то, что мы называем «преобразованием канонизации» - причудливое слово для конвертируйте схему в стиль русской куклы, используя вместо этого модель PSVI. Есть много вещей, которые можно было бы здесь сыграть: использование атрибута id, крах лишних последовательностей, замена единственного варианта xsd: выбора и т. Д. - вот почему мы имеем его в разработке, но еще не опубликованы.

Еще одна вещь, которую мы должны были предусмотреть в нашем сравнении (и вы, возможно, захотите рассмотреть), имела отношение к эквивалентности не только XSD / XML, но и артефактов, генерируемых XSD (например, Java-классы через JAXB); В дополнение к этому, шаблоны расширяемости, те, которые используют дикие карты (xsd: any и anyAttribute).

Мы (QTAssistant) в настоящее время заинтересованы работать с вами по более конкретным требованиям (нам понадобится начать с обмена представительными XSD, NDA, которые я бы принял, и т. д.), вне диапазона, чтобы увидеть, действительно ли мы могли бы заставить его работать. Если вы хотите продолжить, не стесняйтесь обращаться ко мне через адрес поддержки веб-сайта, связанный с моим профилем SO.

4
задан coldspeed 5 September 2017 в 23:41
поделиться

2 ответа

Вариант 1

Используйте df.merge

out = df1.merge(df2, left_on='store', right_on='store_code')\
                       [['id', 'store', 'address', 'warehouse']]
print(out)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Вариант 2

Используя pd.concat и df.sort_values

out = pd.concat([df1.sort_values('store'),\
       df2.sort_values('store_code')[['warehouse']].reset_index(drop=1)], 1)
print(out)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Первый вызов сортировки избыточен, если ваш фреймворк уже отсортирован на store, и в этом случае вы можете его удалить.


Вариант 3

Использование df.replace

s = df1.store.replace(df2.set_index('store_code')['warehouse'])
print(s) 
0    Land
1     Sea
2    Land
3    Land
4     Sea

df1['warehouse'] = s
print(df1)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

Альтернативно, создайте отображение явно. Это работает, если вы хотите использовать его позже.

mapping = dict(df2[['store_code', 'warehouse']].values) # separate step
df1['warehouse'] = df1.store.replace(mapping) # df1.store.map(mapping)
print(df1)

   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea
4
ответ дан coldspeed 16 August 2018 в 02:28
поделиться

Используйте map или join :

df1['warehouse'] = df1['store'].map(df2.set_index('store_code')['warehouse'])
print (df1)
   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea

df1 = df1.join(df2.set_index('store_code'), on=['store']).drop('serialNo', 1)
print (df1)
   id  store address warehouse
0   1    100     xyz      Land
1   2    200     qwe       Sea
2   3    300     asd      Land
3   4    400     zxc      Land
4   5    500     bnm       Sea
1
ответ дан jezrael 16 August 2018 в 02:28
поделиться
  • 1
    Я получаю эту ошибку при запуске .map-кода в аналогичном наборе данных. Reindexing only valid with uniquely valued Index objects – Shubham 5 September 2017 в 09:01
  • 2
    Я думаю, что у вас есть дубликаты в store_code в df2. поэтому нужно df1['store'].map(df2.drop_duplicates('store_code').set_index('store_code')['warehouse']) – jezrael 5 September 2017 в 09:05
  • 3
    верный! Благодаря :) – Shubham 5 September 2017 в 09:14
Другие вопросы по тегам:

Похожие вопросы: