Группировать по строковому столбцу и применять функцию на основе уникального значения в массиве списка? - PullRequest
0 голосов
/ 27 ноября 2018
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
...