Создание накопительного списка pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть этот фрейм данных

 lst = [[1,0],[None,1],[2,0],[2,0],[None,1],[None,1],[3,0],[None,1] ]
df1 = pd.DataFrame(lst,columns = ['id','is_cumulative'])
  

вывод

   id  is_cumulative
0  1.0              0
1  NaN              1
2  2.0              0
3  2.0              0
4  NaN              1
5  NaN              1
6  3.0              0
7  NaN              1
  

Я хочу заменить значения NaN на накопительный список для id столбца

           id  is_cumulative
0          1              0
1        [1]              1
2          2              0
3          2              0
4     [1, 2]              1
5     [1, 2]              1
6          3              0
7  [1, 2, 3]              1
  

Некоторое объяснение: — где бы is_cumulative значение ни было равно 1, у нас есть значение NaN для id столбца, поскольку нам нужно вычислить накопительный список идентификаторов, чтобы заменить его.
Данные похожи на новый идентификатор, чем кумулятивный из всех предыдущих идентификаторов, произошедших до сих пор, чем снова какой-то новый идентификатор и кумулятивный из всех идентификаторов, произошедших до этой строки.

Комментарии:

1. почему строки 4 и 5 равны [1,2]?

2. некоторые идентификаторы могут повторяться несколько раз. Идентификатор 2 повторяется дважды, поэтому в желаемом выводе 4 и 5 будет [1,2]

Ответ №1:

вот один из способов:

 df1['id'] = df1['id'].fillna(df1['id'].dropna().drop_duplicates()
                                      .astype(int) #this might not be necessary
                                      .apply(lambda x: [x]).cumsum()
                                      .reindex(df1.index, method='ffill'))
print(df1)

          id  is_cumulative
0          1              0
1        [1]              1
2          2              0
3          2              0
4     [1, 2]              1
5     [1, 2]              1
6          3              0
7  [1, 2, 3]              1
  

Ответ №2:

Давайте попробуем использовать только идентификатор с dropna и отбросим дубликат, cumsum затем результат reindex и fillna

 s = (df1.id.dropna().drop_duplicates().astype(str) ',').cumsum().str[:-1].str.split(',').reindex(df1.index).ffill()
df1.id = df1.id.fillna(s)
df1
Out[425]: 
                id  is_cumulative
0                1              0
1            [1.0]              1
2                2              0
3                2              0
4       [1.0, 2.0]              1
5       [1.0, 2.0]              1
6                3              0
7  [1.0, 2.0, 3.0]              1