Pandas Tidy DataFrame из Excel с множеством таблиц на одном листе - PullRequest
0 голосов
/ 14 февраля 2019

Мне постоянно приходится работать с противными листами Excel с несколькими таблицами на одном листе.Я прочитал один из них, и кадр данных выглядел так:

CSV ЗДЕСЬ

# (see csv file)

import pandas as pd
df = pd.read_csv('SO_csv.csv')
df

Out[]:
Unnamed: 0               Monday              Tuesday            Wednesday             Thursday               Friday             Saturday               Sunday     Total
0    0th Week  2019-01-07 00:00:00  2019-01-08 00:00:00  2019-01-09 00:00:00  2019-01-10 00:00:00  2019-01-11 00:00:00  2019-01-12 00:00:00  2019-01-13 00:00:00       NaN
1       item0             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
2       item1             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
3       item2             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
4       item3             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
5       Total              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012       NaN
6         NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN       NaN
7         NaN               Monday              Tuesday            Wednesday             Thursday               Friday             Saturday               Sunday       NaN
8    1st Week  2019-01-14 00:00:00  2019-01-15 00:00:00  2019-01-16 00:00:00  2019-01-17 00:00:00  2019-01-18 00:00:00  2019-01-19 00:00:00  2019-01-20 00:00:00       NaN
9       item0             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
10      item1             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
11      item2             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
12      item3             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
13      item4             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
14      item5             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
15      Total              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012       NaN
16        NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN       NaN
17        NaN               Monday              Tuesday            Wednesday             Thursday               Friday             Saturday               Sunday       NaN
18   2nd Week  2019-01-21 00:00:00  2019-01-22 00:00:00  2019-01-23 00:00:00  2019-01-24 00:00:00  2019-01-25 00:00:00  2019-01-26 00:00:00  2019-01-27 00:00:00       NaN
19      item0             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
20      item1             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
21      item2             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
22      item6             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
23      item3             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
24      item4             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
25      item5             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
26      Total              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012       NaN
27        NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN       NaN
28        NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN       NaN
29        NaN               Monday              Tuesday            Wednesday             Thursday               Friday             Saturday               Sunday       NaN
30   3rd Week           28/01/2019           29/01/2019           30/01/2019           31/01/2019  2019-01-02 00:00:00  2019-02-02 00:00:00  2019-03-02 00:00:00       NaN
31      item0             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
32      item1             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
33      item2             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
34      item6             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
35      item3             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
36      item4             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
37      item5             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017             0.510017  3.570116
38      Total              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012              3.57012       NaN
39        NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN                  NaN       NaN

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

Примечание: код здесь только для демонстрации вывода, не объясняя, что я пытался.

# THIS IS ALL JUST TO CREATE A DATAFRAME TO SHOW YOU WHAT IT SHOULD LOOK LIKE
items = ['item0', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7']
weeks = [1,2,3]
days = list(calendar.day_name)
arrays_len = len(weeks) * len(days) * len(items)

dates = df_.loc[weeks_bool,item_cols].melt()
dates['value'] = pd.to_datetime(dates['value'])
dates = dates.sort_values(by='value')
dates = list(dates['value'].astype(str)) # len 28

# length 168 arrays
items = np.tile(items, int(len_arrays / len(items) ))
weeks = np.repeat(weeks, int(len_arrays / len(weeks)))
days = np.repeat(days, int(len_arrays / len(days)))
vals = np.repeat(0.510017, int(len_arrays))
dates = np.repeat(dates, int(len_arrays / len(dates)))

pd.DataFrame({'weeks': weeks,'days': days, 'dates':dates,'items': items,'value': vals}).head()

Out[]:
    weeks       days       dates  items     value
0      1     Monday  2019-01-02  item0  0.510017
1      1    Tuesday  2019-01-02  item1  0.510017
2      1  Wednesday  2019-01-02  item2  0.510017
3      1   Thursday  2019-01-02  item3  0.510017
4      1     Friday  2019-01-02  item4  0.510017

Может кто-нибудь помочь мне с этимкакой-нибудь мастер панд?

Мои мысли / попытки до сих пор

  • Я дошел до того, что нашел начальный индекс каждой таблицы
  • Но ключевой проблемой, с которой я столкнулся, было то, чтокак использовать этот индекс для выбора НОВЫХ таблиц
  • , поскольку число строк WHITESPACE (все NAN) является переменным (1 или 2)
  • , а также количество элементов является переменным

В качестве первого шага я хочу сгруппировать от значения True до (но не включая) следующего истинного значения.

weeks_bool = df['Unnamed: 0'].str.contains('Week').fillna(False)
...