Найти последний идентификатор и значения приращения в панде - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть датафрейм со значениями как таковыми:

╔════╦═════════╦══════╦═══════╗
║ id ║ quarter ║ year ║ value ║
╠════╬═════════╬══════╬═══════╣
║  1 ║       4 ║ 2017 ║     5 ║
║  1 ║       1 ║ 2018 ║     7 ║
║  2 ║       1 ║ 2018 ║     8 ║
╚════╩═════════╩══════╩═══════╝

Я хочу найти последний идентификатор и увеличить кварталы до 4, сохраняя при этом то же значение. Ожидаемый результат:

╔════╦═════════╦══════╦═══════╗
║ id ║ quarter ║ year ║ value ║
╠════╬═════════╬══════╬═══════╣
║  1 ║       4 ║ 2017 ║     5 ║
║  1 ║       1 ║ 2018 ║     7 ║
║  1 ║       2 ║ 2018 ║     7 ║
║  1 ║       3 ║ 2018 ║     7 ║
║  1 ║       4 ║ 2018 ║     7 ║
║  2 ║       1 ║ 2018 ║     8 ║
║  2 ║       2 ║ 2018 ║     8 ║
║  2 ║       3 ║ 2018 ║     8 ║
║  2 ║       4 ║ 2018 ║     8 ║
╚════╩═════════╩══════╩═══════╝

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

Ответы [ 2 ]

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

Сначала получите последний ряд в каждой группе:

s = df.groupby('id').tail(1)

Затем увеличьте до четырех четвертей:

out = pd.concat([s]*4).sort_values('id').assign(quarter=np.tile([1,2,3,4], len(s)))

Наконец, объединить:

df.merge(out, how='outer').sort_values('id')

   id  quarter  year  value
0   1        4  2017      5
1   1        1  2018      7
3   1        2  2018      7
4   1        3  2018      7
5   1        4  2018      7
2   2        1  2018      8
6   2        2  2018      8
7   2        3  2018      8
8   2        4  2018      8
0 голосов
/ 06 сентября 2018

1-й вы можете использовать drop_duplicate, чтобы получить последнее значение каждого идентификатора

df1=df.drop_duplicates('id',keep='last')

df1=df1.reindex(df1.index.repeat(4-df1.quarter+1)).assign(quarter=lambda x : x['id'].groupby(x['id']).cumcount()+x['quarter'])# then we create the target df by using reindex and assign the new value of quarter
yourdf=pd.concat([df.loc[~df.index.isin(df1.index)],df1])# concat the one we drop before we yield the result 
yourdf
Out[264]: 
   id  quarter  year  value
0   1        4  2017      5
1   1        1  2018      7
1   1        2  2018      7
1   1        3  2018      7
1   1        4  2018      7
2   2        1  2018      8
2   2        2  2018      8
2   2        3  2018      8
2   2        4  2018      8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...