Предположим, вы начинаете с этими данными:
df = pd.DataFrame({'ID': ('STRSUB BOTDWG'.split())*4,
'Days Late': [60, 60, 50, 50, 20, 20, 10, 10],
'quantity': [56, 20, 60, 67, 74, 87, 40, 34]})
# Days Late ID quantity
# 0 60 STRSUB 56
# 1 60 BOTDWG 20
# 2 50 STRSUB 60
# 3 50 BOTDWG 67
# 4 20 STRSUB 74
# 5 20 BOTDWG 87
# 6 10 STRSUB 40
# 7 10 BOTDWG 34
Тогда вы можете найти категорию статуса, используя pd.cut
. Обратите внимание, что по умолчанию pd.cut
разбивает серии df['Days Late']
на категории, которые полуоткрытых интервалы, (-1, 14], (14, 35], (35, 56], (56, 365]
:
df['status'] = pd.cut(df['Days Late'], bins=[-1, 14, 35, 56, 365], labels=False)
labels = np.array('White Yellow Amber Red'.split())
df['status'] = labels[df['status']]
del df['Days Late']
print(df)
# ID quantity status
# 0 STRSUB 56 Red
# 1 BOTDWG 20 Red
# 2 STRSUB 60 Amber
# 3 BOTDWG 67 Amber
# 4 STRSUB 74 Yellow
# 5 BOTDWG 87 Yellow
# 6 STRSUB 40 White
# 7 BOTDWG 34 White
Теперь используют pivot
, чтобы получить DataFrame в нужной форме:
df = df.pivot(index='ID', columns='status', values='quantity')
и используйте reindex
для получения желаемого заказа для рядов и столбцов:
df = df.reindex(columns=labels[::-1], index=df.index[::-1])
Таким образом,
import numpy as np
import pandas as pd
df = pd.DataFrame({'ID': ('STRSUB BOTDWG'.split())*4,
'Days Late': [60, 60, 50, 50, 20, 20, 10, 10],
'quantity': [56, 20, 60, 67, 74, 87, 40, 34]})
df['status'] = pd.cut(df['Days Late'], bins=[-1, 14, 35, 56, 365], labels=False)
labels = np.array('White Yellow Amber Red'.split())
df['status'] = labels[df['status']]
del df['Days Late']
df = df.pivot(index='ID', columns='status', values='quantity')
df = df.reindex(columns=labels[::-1], index=df.index[::-1])
print(df)
дает
Red Amber Yellow White
ID
STRSUB 56 60 74 40
BOTDWG 20 67 87 34
Большое вам спасибо за это, я думаю, что это поможет мне многое сделать с PANDAS в моей повседневной работе. Спасибо также mtadd, я заметил, что вы также обновили свой ответ (это объясняется). – PrestonDocks