Заполнение в последовательности предыдущих значений на основе текущего значения в пандах - PullRequest
0 голосов
/ 01 октября 2018

У меня есть фрейм данных pandas, который выглядит следующим образом:

ID   Value
1      2
2      6
3      3
4      5

Я хочу новый фрейм данных, который дает

ID Value 1 0 1 1 1 2 2 0 2 1 2 2 2 3 2 4 2 5 2 6 3 1 3 2 3 3 3 4

Любые предложения будутбыть оцененным.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Использование reindex с repeat и cumcount для получения нового значения обновлено

df.reindex(df.index.repeat(df.Value+1)).assign(Value=lambda x : x.groupby('ID').cumcount())
Out[611]: 
   ID  Value
0   1      0
0   1      1
0   1      2
1   2      0
1   2      1
1   2      2
1   2      3
1   2      4
1   2      5
1   2      6
2   3      0
2   3      1
2   3      2
2   3      3
3   4      0
3   4      1
3   4      2
3   4      3
3   4      4
3   4      5
0 голосов
/ 01 октября 2018

Использование stack и понимание списка:

vals = [np.arange(i+1) for i in df.Value]

(pd.DataFrame(vals, index=df.ID)
    .stack().reset_index(1, drop=True).astype(int).to_frame('Value'))

    Value    
ID           
1       0    
1       1    
1       2    
2       0    
2       1    
2       2    
2       3    
2       4    
2       5    
2       6    
3       0    
3       1    
3       2    
3       3    
4       0    
4       1    
4       2    
4       3    
4       4    
4       5    
0 голосов
/ 01 октября 2018

Попробуй,

new_df = df.groupby('ID').Value.apply(lambda x: pd.Series(np.arange(x+1)))\
.reset_index().drop('level_1', 1)


    ID  Value
0   1   0
1   1   1
2   1   2
3   2   0
4   2   1
5   2   2
6   2   3
7   2   4
8   2   5
9   2   6
10  3   0
11  3   1
12  3   2
13  3   3
14  4   0
15  4   1
16  4   2
17  4   3
18  4   4
19  4   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...