Объединение двух кадров данных для создания одного файла повторяющихся значений - PullRequest
2 голосов
/ 07 октября 2019

У меня есть файл .XLSX с 2 столбцами.

и. Столбец хранит несколько ссылок на данные и разделяется точкой с запятой. Мне нужно манипулировать этим набором данных при вводе, и я с трудом думаю, какое направление лучше всего сделать.

Думая о замене точки с запятой на (,), а затем упаковке данных в словарь, где ключ является ключом, а значение списка становится значением.

Однако яЯ не уверен, что это наиболее эффективный маршрут.

d = {'<Name>':['FIL9791','FIL9799','FIL4056','FIL4056','FIL4057'],'<Item To Package>':['package_113572195;package_113594355','package_113572197;package_113594357','package_113566689;package_113591417','package_113566688;package_113591416','package_113566690;package_113591418']

df =pd.DataFrame(data=d)
df.head()

sku = df['<Name>']
upc = df['<Item To Package>']

PartToUPC = {}
PartToUPC[sku]=upc

Ниже показано, как мне нужно, чтобы файл выглядел

Все скусы в столбце A и их отдельные коды пакетов в столбце B

FIL9791 | package_113572195

FIL9791 | package_113594355

FIL9799 | package_113572197

FIL9799 | package_113594357

и т. Д.

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы можете решить эту проблему, используя .explode() после разделения столбцов на список из двух значений.

import pandas as pd 
import numpy as np
from pandas.io.json import json_normalize
d = {'<Name>':['FIL9791','FIL9799','FIL4056','FIL4056','FIL4057'],'<Item To Package>':['package_113572195;package_113594355','package_113572197;package_113594357','package_113566689;package_113591417','package_113566688;package_113591416','package_113566690;package_113591418']}

df = pd.DataFrame(data=d)
df['<Item To Package>'] = df['<Item To Package>'].str.split(';') 
df = df.explode('<Item To Package>')
print(df)

Вывод:

    <Name>  <Item To Package>
0  FIL9791  package_113572195
0  FIL9791  package_113594355
1  FIL9799  package_113572197
1  FIL9799  package_113594357
2  FIL4056  package_113566689
2  FIL4056  package_113591417
3  FIL4056  package_113566688
3  FIL4056  package_113591416
4  FIL4057  package_113566690
4  FIL4057  package_113591418

Имейте в виду explode() сохраняетисходный индекс для столбца, который вы применили. Так что, если вы хотите сбросить индекс, потому что он не нужен, чтобы соответствовать исходному. Вы можете добавить:

df = df.reset_index(drop=True)
print(df)

Вывод:

    <Name>  <Item To Package>
0  FIL9791  package_113572195
1  FIL9791  package_113594355
2  FIL9799  package_113572197
3  FIL9799  package_113594357
4  FIL4056  package_113566689
5  FIL4056  package_113591417
6  FIL4056  package_113566688
7  FIL4056  package_113591416
8  FIL4057  package_113566690
9  FIL4057  package_113591418
1 голос
/ 07 октября 2019

Я думаю, это то, что вам нужно

d = {'<Name>':['FIL9791','FIL9799','FIL4056','FIL4056','FIL4057'],'<Item To Package>':['package_113572195;package_113594355','package_113572197;package_113594357','package_113566689;package_113591417','package_113566688;package_113591416','package_113566690;package_113591418']}
df = pd.DataFrame(data=d)
new_df = pd.DataFrame(df["<Item To Package>"].str.split(';').tolist(), index=df["<Name>"]).stack()
new_df = new_df.reset_index([0, '<Name>'])
new_df.columns = ['<Name>', '<Item To Package>']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...