Инструменты, которые проверяют XML в отношении схемы, уже знают, как это сделать, потому что в случае <xs:complexContent><xs:restriction>
новый тип должен быть подмножеством ограниченного типа.
Если вы хотите задействовать эту функциональность, вы можете иметь дочерние схемы для определения сложных типов, которые ограничивают типы в вашей схеме чертежа.
Если дочерние схемы создаются без этого, однако, это может возможно, все еще выполняется путем изменения дочерних схем для соответствия шаблону ниже, а затем отправки их через процессор схемы для проверки.
Пример схемы чертежа, blueprintschema.xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootType"/>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="child1" minOccurs="0"/>
<xs:element name="child2" minOccurs="0"/>
<xs:element name="child3" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Пример дочерней схемы, которая является подмножеством схемы чертежа:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootType"/>
<xs:complexType name="rootType">
<xs:sequence>
<xs:element name="child2"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Пример детской схемы после преобразования в конструкцию redefine:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:redefine schemaLocation="blueprintschema.xsd">
<xs:complexType name="rootType">
<xs:complexContent>
<xs:restriction base="rootType">
<xs:sequence>
<xs:element name="child2"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
<xs:element name="root" type="rootType"/>
</xs:schema>
Затем процессор схемы скажет вам, переопределенный «rootType» на самом деле является подмножеством исходного плана «rootType»
Поскольку схема является просто XML, преобразование может быть выполнено u петь обычные инструменты обработки XML.
Вариант 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