Преобразование выбранных столбцов фрейма данных в векторное представление (включая повторяющиеся значения) - PullRequest
0 голосов
/ 10 июля 2020

У меня есть приведенный ниже фрейм данных (product.csv), который я хочу преобразовать в векторное представление:

product_id,value
111,3000
121,2500
131,3500
141,1000
111,3300
151,2000
161,2300
171,1300
181,1500
191,4500
121,6000
121,1100

Мой ожидаемый результат должен включать все строки, включая повторяющиеся product_ids, и быть в векторной форме, как показано ниже :

[111: 3000; 121: 2500; 131: 3500; 141: 1000; 111: 3300; 151: 2000; 161: 2300; 171: 1300; 181: 1500; 191: 4500; 121: 6000; 121: 1100]

Это то, что я пробовал до сих пор:

import pandas as pd

df = pd.read_csv('product.csv') #, index_col=0, sep=','

my_dict_indx = df.set_index('product_id')['value'].to_dict()
print(my_dict_indx)

my_dict_zip = dict(zip(df.product_id, df.value))
print(my_dict_zip)

my_dict_groupby = df.groupby(level=0).apply(lambda x: x.to_dict('r')).to_dict()
print(my_dict_groupby)

Однако оба my_dict_indx = df.set_index('product_id')['value'].to_dict() и my_dict_zip = dict(zip(df.product_id, df.value)) дают мне результат ниже, но исключают повторяющиеся product_ids 111 и 121, не возвращают правильный порядок (например, вывод начинается с 161: 2300 вместо 111: 3000):

{161: 2300, 131: 3500, 171: 1300, 141: 1000, 111: 3300, 181: 1500, 151: 2000, 121: 1100, 191: 4500}

С другой стороны, my_dict_groupby = df.groupby(level=0).apply(lambda x: x.to_dict('r')).to_dict() дает мне правильное количество записей и правильную последовательность ниже, но включает ненужные индексы столбцов, имена столбцов и без векторного представления.

{0: [{'product_id': 111, 'value': 3000}], 1: [{'product_id': 121, 'value': 2500}], 2: [{'product_id': 131, 'value': 3500}], 3: [{'product_id': 141, 'value': 1000}], 4: [{ 'product_id': 111, 'value': 3300}], 5: [{'product_id': 151, 'value': 2000}], 6: [{'product_id': 161, 'value': 2300}], 7: [{'product_id': 171, 'value': 1300}], 8: [{'product_id': 181, 'value': 1500}], 9: [{'product_id': 1 91, 'значение': 4500}], 10: [{'product_id': 121, 'value': 6000}], 11: [{'product_id': 121, 'value': 1100}]}

Как я могу улучшить свое решение, чтобы получить ожидаемый результат в векторной форме [] вместо словарной формы {}. Заранее спасибо.

1 Ответ

2 голосов
/ 10 июля 2020

Я бы создал массив строк, потому что это единственный способ поддержать желаемый формат вывода. Затем вы можете просто использовать .values, чтобы получить столбец / массив из серии pandas

df['output_col'] = (df['product_id'].astype(str) + ':' + df['value'].astype(str)).values

Вывод:

array(['111:3000', '121:2500', '131:3500', '141:1000', '111:3300',
       '151:2000', '161:2300', '171:1300', '181:1500', '191:4500',
       '121:6000', '121:1100'], dtype=object)

Если вы wi sh, чтобы он был список вместо массива, просто добавьте .tolist() после метода .values. Наконец, имейте в виду, что в Python a , используется для разделения элементов в массиве / списке вместо ;

...