Спасибо, @ 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 имеет еще три функции:
Еще одна вещь, которую мы должны были предусмотреть в нашем сравнении (и вы, возможно, захотите рассмотреть), имела отношение к эквивалентности не только XSD / XML, но и артефактов, генерируемых XSD (например, Java-классы через JAXB); В дополнение к этому, шаблоны расширяемости, те, которые используют дикие карты (xsd: any и anyAttribute).
Мы (QTAssistant) в настоящее время заинтересованы работать с вами по более конкретным требованиям (нам понадобится начать с обмена представительными XSD, NDA, которые я бы принял, и т. д.), вне диапазона, чтобы увидеть, действительно ли мы могли бы заставить его работать. Если вы хотите продолжить, не стесняйтесь обращаться ко мне через адрес поддержки веб-сайта, связанный с моим профилем SO.
Вариант 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
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
Reindexing only valid with uniquely valued Index objects
– Shubham
5 September 2017 в 09:01
store_code
в df2
. поэтому нужно df1['store'].map(df2.drop_duplicates('store_code').set_index('store_code')['warehouse'])
– jezrael
5 September 2017 в 09:05