x = [{'id': 'Q', 'condition': ['a','b','d'], 'a': np.nan, 'b': np.nan, 'c': np.nan, 'd': np.nan},
{'id': 'Q', 'condition': ['b','a','d'], 'a': 1, 'b': 1, 'c': np.nan, 'd': 1},
{'id': 'R', 'condition': ['b','a','d'], 'a': 3, 'b': 3, 'c': np.nan, 'd': 3},
{'id': 'Q', 'condition': ['a','b','c'], 'a': 5, 'b': 5, 'c': 8, 'd': np.nan},]
pd.DataFrame(x, columns=['id','condition','a','b','c','d'])
>> id condition a b c d
0 Q [a, b, d] nan nan nan nan
1 Q [b, a, d] 1.00000 1.00000 nan 1.00000
2 R [b, a, d] 3.00000 3.00000 nan 3.00000
3 Q [a, b, c] 5.00000 5.00000 8.00000 nan
Я хочу сгруппировать по столбцу id , и на основе уникальных значений, найденных в формате списка в столбце условие , я хочу применить функцию lambda x: x.rolling(2, min_periods=1).sum()
.
Например, допустим, мы применили бы функцию к индексу 3, поэтому сгруппировали бы по id 'Q' , а затем посмотрим на ее первое условие ( 'a' ), у 'a' есть столбец, и мы просто сделали бы сумму индексов 1 и 3, соответствующих столбцу 'a'.Итак, функция rolling(2, min_periods=1).sum()
должна дать 6.00000
Таким образом, мой ожидаемый результат для всего df будет следующим:
Я буду использовать первый ивторое условие, чтобы все было просто.
>> id condition [...] cond1_rolling_sum_2 cond2_rolling_sum_2
0 Q [a, b, d] [...] nan nan
1 Q [b, a, d] [...] 1 1
2 R [b, a, d] [...] 3 3
3 Q [a, b, c] [...] 6 nan