Разобрать столбец dataframe по запятой и pivot - python - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь разобрать столбец через запятую (также убирая пробел) и затем переворачивая все исходные / целевые комбинации в новые строки.Вот пример данных:

Origin     Destination     Weight
PVG        AMS, FRA        10,000
CAN, XMN   LAX, ORD        25,000

У меня проблемы с воспроизведением указанного выше кадра данных с использованием pd.read_clipboard, поэтому вот код кадра данных:

df = pd.DataFrame({'Origin': ['PVG', 'CAN, XMN'], 
                   'Destination': ['AMS, FRA', 'LAX, ORD'],
                   'Weight': [10000, 25000]})

Требуемый вывод будетbe:

Origin     Destination     Weight
PVG        AMS             10,000
PVG        FRA             10,000
CAN        LAX             25,000   
CAN        ORD             25,000
XMN        LAX             25,000
XMN        ORD             25,000   

Я пытался использовать:

df['Origin'].str.split(',', expand = True)

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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Используйте itertools.product с list comprehenion, только сначала создавайте списки с applymap:

from  itertools import product

df1 = df.applymap(lambda x: x.split(', ') if isinstance (x, str) else [x])
df2 = pd.DataFrame([j for i in df1.values for j in product(*i)], columns=df.columns)
print (df2)
  Origin Destination  Weight
0    PVG         AMS   10000
1    PVG         FRA   10000
2    CAN         LAX   25000
3    CAN         ORD   25000
4    XMN         LAX   25000
5    XMN         ORD   25000
0 голосов
/ 11 июня 2018

Вы должны использовать itertools.product здесь.

from itertools import product
df_dict = {
    x[-1]: pd.DataFrame(list(
        product(x[0].split(', '), x[1].split(', ')))
    ) for x in df.values.tolist()
}

df = pd.concat(df_dict).reset_index(level=-1, drop=True).reset_index() 
df.columns = ['Weight', 'Destination', 'Origin']

df 
   Weight Destination Origin
0   10000         AMS    PVG
1   10000         FRA    PVG
2   25000         LAX    CAN
3   25000         LAX    XMN
4   25000         ORD    CAN
5   25000         ORD    XMN
...