У меня есть данные о моих клиентах за последние восемь месяцев, однако эти месяцы не совпадают, это только последние месяцы, которые они были у нас. Ежемесячные платежи и штрафы хранятся в строках, но я хочу, чтобы каждый из последних восьми месяцев был столбцом.
Что у меня есть:
Customer Amount Penalties Month
123 500 200 1/7/2017
123 400 100 1/6/2017
...
213 300 150 1/4/2015
213 200 400 1/3/2015
Что я хочу:
Customer Month-8-Amount Month-7-Amount ... Month-1-Amount Month-1-Penalties ...
123 500 400 450 300
213 900 250 300 200
...
Что я пробовал:
df = df.pivot(index=num, columns=[amount,penalties])
У меня такая ошибка:
ValueError: all arrays must be same length
Есть какой-нибудь идеальный способ сделать это?
Вы можете сделать это с unstack
и set_index
# assuming all date is sort properly , then we do cumcount
df['Month']=df.groupby('Customer').cumcount()+1
# slice the most recent 8 one
df=df.loc[df.Month<=8,:]# slice the most recent 8 one
# doing unstack to reshape your df
s=df.set_index(['Customer','Month']).unstack().sort_index(level=1,axis=1)
# flatten multiple index to one
s.columns=s.columns.map('{0[0]}-{0[1]}'.format)
s.add_prefix("Month-")
Out[189]:
Month-Amount-1 Month-Penalties-1 Month-Amount-2 Month-Penalties-2
Customer
123 500 200 400 100
213 300 150 200 400
Это выглядит довольно круто, но я хочу, чтобы столбцы располагались по порядку восемь месяцев, независимо от того, что это за месяцы. Таким образом, первым будет сумма, например, 7/2017 для одного клиента и 6/2014 для другого. Во втором столбце будут суммы за 6/2017 и 5/2014 для этих клиентов соответственно и так далее.
@Memduh просто посмотрите свой комментарий под своим вопросом, проверьте его сейчас
@Wen - Намного лучше, :)
Вы можете изменить условия формата и получить точный запрос вывода OP .columns.map('{0[1]}_{0[0]}'.format)
LOL ... как вам нравится, когда все это происходит за рулем на заднем сиденье. Вроде как парное программирование.
@ScottBoston с помощью ваших ребят, чувствую себя намного лучше: -)
@ScottBoston: да, именно так, я не хочу принимать во внимание фактический месяц, когда это произошло.