pandas сводная таблица продаж

У меня есть список, как показано ниже:

saleid upc 0 155_02127453_20090616_135212_0021 02317639000000 1 155_02127453_20090616_135212_0021 00000000000888 2 155_01605733_20090616_135221_0016 00264850000000 3 155_01072401_20090616_135224_0010 02316877000000 4 155_01072401_20090616_135224_0010 05051969277205 

Он представляет одного клиента (saleid) и предметы, которые он получил (вверху предмета)

Я хочу, чтобы эта таблица сворачивалась в форму, как показано ниже:

  02317639000000 00000000000888 00264850000000 02316877000000 155_02127453_20090616_135212_0021 1 1 0 0 155_01605733_20090616_135221_0016 0 0 1 0 155_01072401_20090616_135224_0010 0 0 0 0 

Таким образом, столбцы являются уникальными UPC, а строки являются уникальными SALEID.

я прочитал это так:

 tbl = pd.read_csv('tbl_sale_items.csv',sep=';',dtype={'saleid': np.str, 'upc': np.str}) tbl.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 18570726 entries, 0 to 18570725 Data columns (total 2 columns): saleid object upc object dtypes: object(2) memory usage: 283.4+ MB 

Я сделал несколько шагов, но не правильные!

 tbl.pivot_table(columns=['upc'],aggfunc=pd.Series.nunique) upc 00000000000000 00000000000109 00000000000116 00000000000123 00000000000130 00000000000147 00000000000154 00000000000161 00000000000178 00000000000185 ... saleid 44950 287 26180 4881 1839 623 3347 7 

EDIT: Я использую вариант решения ниже:

 chunksize = 1000000 f = 0 for chunk in pd.read_csv('tbl_sale_items.csv',sep=';',dtype={'saleid': np.str, 'upc': np.str}, chunksize=chunksize): print(f) t = pd.crosstab(chunk.saleid, chunk.upc) t.head(3) t.to_csv('tbl_sales_index_converted_' + str(f) + '.csv.bz2',header=True,sep=';',compression='bz2') f = f+1 

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

Вопрос 2: есть ли способ заставить все куски иметь одни и те же столбцы?

2 Solutions collect form web for “pandas сводная таблица продаж”

Опция 1

 df.groupby(['saleid', 'upc']).size().unstack(fill_value=0) 

введите описание изображения здесь

Вариант 2

 pd.crosstab(df.saleid, df.upc) 

введите описание изображения здесь

Настроить

 from StringIO import StringIO import pandas as pd text = """ saleid upc 0 155_02127453_20090616_135212_0021 02317639000000 1 155_02127453_20090616_135212_0021 00000000000888 2 155_01605733_20090616_135221_0016 00264850000000 3 155_01072401_20090616_135224_0010 02316877000000 4 155_01072401_20090616_135224_0010 05051969277205""" df = pd.read_csv(StringIO(text), delim_whitespace=True, dtype=str) df 

введите описание изображения здесь

простое pivot_table() :

 In [16]: df.pivot_table(index='saleid', columns='upc', aggfunc='size', fill_value=0) Out[16]: upc 00000000000888 00264850000000 02316877000000 02317639000000 05051969277205 saleid 155_01072401_20090616_135224_0010 0 0 1 0 1 155_01605733_20090616_135221_0016 0 1 0 0 0 155_02127453_20090616_135212_0021 1 0 0 1 0 
  • Как создать и заполнить рамку данных pandas из цикла?
  • Использование срезов в Python
  • AttributeError: объект 'list' не имеет атрибута 'dtype'
  • Как иметь кластеры сложенных баров с python (Pandas)
  • Как выровнять индексы многих фреймов данных и заполнить соответствующие пропущенные значения в Pandas?
  • получать число строк данных на основе условий
  • Панды сравнивают следующую строку
  • Получить определенную строку как серию из pandas dataframe
  • Python - лучший язык программирования в мире.