Как частично транспонировать таблицу CSV в Python - PullRequest
0 голосов
/ 18 сентября 2018

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

ИдетFrom This:

Product,Store,9/1/18,9/8/18,9/15/18,9/22/18
vacuum,123,1,5,3,3
toaster,456,5,7,4,10

To This:

Product,Store,Week,Sales
vacuum,123,9/1/18,1
vacuum,123,9/8/18,5
vacuum,123,9/15/18,3
vacuum,123,9/22/18,3
toaster,456,9/1/18,5
toaster,456,9/8/18,7
toaster,456,9/15/18,4
toaster,456,9/22/18,10...

Я новичок в Python (2 дня), и я частично понимаю полную транспонирование с помощью zip_longest / reader / writer, но не могу понять, как сделать частичную версию

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать df.pivot():

df.pivot(index='Product', columns='Store').stack(level=[1,0]).reset_index()

Например:

import pandas as pd

df = pd.read_csv('test.csv')

df = df.pivot(index='Product', columns='Store').stack(level=[1,0]).reset_index()

df.columns = ['Product','Store','Week','Sales']

Что дает:

   Product  Store     Week  Sales
0  toaster    456   9/1/18    5.0
1  toaster    456   9/8/18    7.0
2  toaster    456  9/15/18    4.0
3  toaster    456  9/22/18   10.0
4   vacuum    123   9/1/18    1.0
5   vacuum    123   9/8/18    5.0
6   vacuum    123  9/15/18    3.0
7   vacuum    123  9/22/18    3.0
0 голосов
/ 18 сентября 2018

Также,

df.set_index(['Product','Store']).stack().reset_index()

Вывод:

   Product  Store  level_2   0
0   vacuum    123   9/1/18   1
1   vacuum    123   9/8/18   5
2   vacuum    123  9/15/18   3
3   vacuum    123  9/22/18   3
4  toaster    456   9/1/18   5
5  toaster    456   9/8/18   7
6  toaster    456  9/15/18   4
7  toaster    456  9/22/18  10

С именами очищенных столбцов,

(df.set_index(['Product','Store'])
   .rename_axis('Week', axis=1)
   .stack()
   .rename('Sales')
   .reset_index())

Вывод:

   Product  Store     Week  Sales
0   vacuum    123   9/1/18      1
1   vacuum    123   9/8/18      5
2   vacuum    123  9/15/18      3
3   vacuum    123  9/22/18      3
4  toaster    456   9/1/18      5
5  toaster    456   9/8/18      7
6  toaster    456  9/15/18      4
7  toaster    456  9/22/18     10
0 голосов
/ 18 сентября 2018

Вы можете использовать melt для этого:

df.melt(id_vars=['Product', 'Store',],
                       value_vars=['9/1/18', '9/8/18','9/15/18','9/22/18'], 
                       var_name='week', value_name='Sales')

    Product Store   week    Sales
0   vacuum  123  9/1/18     1
1   toaster 456  9/1/18     5
2   vacuum  123  9/8/18     5
3   toaster 456  9/8/18     7
4   vacuum  123  9/15/18    3
5   toaster 456  9/15/18    4
6   vacuum  123  9/22/18    3
7   toaster 456  9/22/18    10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...