#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