pandas объединяются в столбцы с дубликатами [duplicate]

Инструменты, которые проверяют 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.

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:27
поделиться

Используйте 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:27
поделиться
  • 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
Другие вопросы по тегам:

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