Как объединить значения в columnB на основе значений в columnA - PullRequest
2 голосов
/ 24 марта 2019

У меня xlsx выглядит так:

Company    N
A          1234;878;3434
A          5678;873
B          539
B          00;123
C          155;741;655
C          5377;454

Я использую pandas для импорта в свою программу, могу ли я объединить N, основываясь на их компании?

Желаемый результат: {'A': [1234,878,3434,5678,873], 'B': [539, 00, 123], 'C': [155, 741, 655, 5377, 454]}

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Вы можете прочитать файл xlsx и преобразовать ваш фрейм данных в словарь, используя приведенный ниже код

import pandas as pd
xls_dict = xls_data.to_dict('records')
print(xls_dict)

Затем вы можете сгенерировать требуемый вывод с помощью приведенного ниже кода

output_dict = dict()

for xls_dat in xls_dict:
    key_list = list()
    if 'N' in xls_dat:
        if xls_dat.get('Company') in output_dict:
            lis = output_dict.get(xls_dat.get('Company'))
            lis2 = [int(i) for i in xls_dat.get('N').split(';')]
            output_dict[xls_dat.get('Company')] = lis + lis2
        else:
            key_list = [int(i) for i in xls_dat.get('N').split(';')]
            output_dict[xls_dat.get('Company')] = key_list

Вывод:

{'A': [1234, 878, 3434, 5678, 873], 'B': [539, 0, 123], 'C': [155, 741, 655, 5377, 454]}
2 голосов
/ 24 марта 2019

сгруппировать и разделить, затем применить список и повернуть, чтобы продиктовать как:

import itertools
(df.groupby('Company').apply(lambda x: 
 list(map(int,itertools.chain.from_iterable(x['N'].str.split(';'))))).to_dict())

{'A': [1234, 878, 3434, 5678, 873],
 'B': [539, 0, 123],
 'C': [155, 741, 655, 5377, 454]}

вы также можете использовать sum для составления списков, но не рекомендуется для больших данных (из-за проблем с производительностью лучше использовать itertools)

РЕДАКТИРОВАТЬ для нарезки 2 элементов из списка используйте:

import itertools
(df.groupby('Company').apply(lambda x: 
 list(map(int,[k[:2] for k in itertools.chain.from_iterable(x['N'].str.split(';'))]))).to_dict())

это выводит:

{'A': [12, 87, 34, 56, 87], 'B': [53, 0, 12], 'C': [15, 74, 65, 53, 45]}

Обратите внимание на использование map() здесь, оно используется для преобразования элементов списка из строки в int. Поскольку исходный dtype - это строка, а мы делаем str.split(), в списке есть строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...