Сгруппируйте столбцы на основе заголовков, если они находятся в одном списке. Pandas Python - PullRequest
0 голосов
/ 12 июля 2020

Итак, у меня есть фрейм данных, который выглядит примерно так

Resource    2020-06-01     2020-06-02     2020-06-03
Name1            8               7              8    
Name2            7               9              9 
Name3            10              10             10

Представьте, что заголовок является буквальным во все дни месяца. И что имен гораздо больше, чем три.

Мне нужно сократить количество столбцов до пяти. Считаем, что в первом столбце указаны дни между 2020-06-01 и 2020-06-05. Затем с субботы по пятницу той же недели. Или последний день месяца, если он еще до пятницы. Итак, для июня это будут следующие недели:

week 1: 2020-06-01 to 2020-06-05
week 2: 2020-06-06 to 2020-06-12
week 3: 2020-06-13 to 2020-06-19
week 4: 2020-06-20 to 2020-06-26
week 5: 2020-06-27 to 2020-06-30

У меня нет проблем с определением этих недель. Проблема заключается в группировке столбцов на их основе. Я ничего не мог придумать.

Есть у кого-нибудь идеи по этому поводу?

1 Ответ

0 голосов
/ 12 июля 2020

Мне нужно использовать этот код для генерации вашего фрейма данных.

dates = pd.date_range(start='2020-06-01', end='2020-06-30')
df = pd.DataFrame({
    'Name1': np.random.randint(1, 10, size=len(dates)),
    'Name2': np.random.randint(1, 10, size=len(dates)),
    'Name3': np.random.randint(1, 10, size=len(dates)),
})
df = df.set_index(dates).transpose().reset_index().rename(columns={'index': 'Resource'})

Тогда решение начинается отсюда.

# Set the first column as index
df = df.set_index(df['Resource'])

# Remove the unused column
df = df.drop(columns=['Resource'])

# Transpose the dataframe
df = df.transpose()

# Output:
Resource    Name1   Name2   Name3
2020-06-01 00:00:00 3   2   7
2020-06-02 00:00:00 5   6   8
2020-06-03 00:00:00 2   3   6
...
# Bring "Resource" from index to column
df = df.reset_index()
df = df.rename(columns={'index': 'Resource'})

# Add a column "week of year"
df['week_no'] = df['Resource'].dt.weekofyear

# You can simply group by the week no column
df.groupby('week_no').sum().reset_index()

# Output:
Resource    week_no Name1   Name2   Name3
0   23  38  42  41
1   24  37  30  43
2   25  38  29  23
3   26  29  40  42
4   27  2   8   3

Я не знаю, что вы хочу сделать для следующего. Если вам нужна исходная форма, просто transpose() ее верните.

EDIT: OP утверждал, что неделя должна начинаться с субботы и заканчивается пятницей

# 0: Monday
# 1: Tuesday
# 2: Wednesday
# 3: Thursday
# 4: Friday
# 5: Saturday
# 6: Sunday
df['weekday'] = df['Resource'].dt.weekday.apply(lambda day: 0 if day <= 4 else 1)
df['customised_weekno'] = df['week_no'] + df['weekday']

Вывод:

Resource    Resource    Name1   Name2   Name3   week_no weekday customised_weekno
0   2020-06-01  4   7   7   23  0   23
1   2020-06-02  8   6   7   23  0   23
2   2020-06-03  5   9   5   23  0   23
3   2020-06-04  7   6   5   23  0   23
4   2020-06-05  6   3   7   23  0   23
5   2020-06-06  3   7   6   23  1   24
6   2020-06-07  5   4   4   23  1   24
7   2020-06-08  8   1   5   24  0   24
8   2020-06-09  2   7   9   24  0   24
9   2020-06-10  4   2   7   24  0   24
10  2020-06-11  6   4   4   24  0   24
11  2020-06-12  9   5   7   24  0   24
12  2020-06-13  2   4   6   24  1   25
13  2020-06-14  6   7   5   24  1   25
14  2020-06-15  8   7   7   25  0   25
15  2020-06-16  4   3   3   25  0   25
16  2020-06-17  6   4   5   25  0   25
17  2020-06-18  6   8   2   25  0   25
18  2020-06-19  3   1   2   25  0   25

Итак, вы можете использовать customised_weekno для группировки.

...