Как бы я сгруппировать по уникальным значениям, которые находятся в форме списка? - PullRequest
0 голосов
/ 27 ноября 2018

Если бы я хотел получить среднее из последних двух значений на основе столбца id, я бы сделал следующее:

df['rolling_mean_2'] = df.groupby('id').apply(lambda x: x.rolling(2, min_periods=2).mean())

>>      id   value  rolling_mean_2
   0    b    1      NaN 
   1    b    3      2
   2    d    5      NaN
   3    d    7      6

Правильно, просто.Хорошо, теперь давайте скажем, что мой идентификатор находится в форме списка с 4 уникальными значениями (a, b, c, d)

 x = [{'id': ['a','b','d'], 'value':1},
      {'id': ['b','a','d'], 'value':3},
      {'id': ['b','a','d'], 'value':5},
      {'id': ['a','b','c'], 'value':7}]

 df = pd.DataFrame(x)

Теперь, как бы я получил среднее значение изпоследние 2 значения (включая текущую строку) на основе уникального значения, которое содержится в списке?Таким образом, мой ожидаемый результат будет следующим:

Я собираюсь использовать переменные a и d , чтобы сохранить порядок и простоту.

>>          id          value      a_rolling_mean_2      d_rolling_mean_2   
      0     [a, b, d]   1          NaN                   NaN
      1     [b, a, d]   3          2                     2          
      2     [b, a, d]   5          4                     4
      3     [a, b, c]   7          6                     NaN          

1 Ответ

0 голосов
/ 27 ноября 2018

Используя concat с конструктором dataframe, воссоздайте dataframe

df=df.rename(columns={'value':'V'})
newdf=pd.concat([df.V,pd.DataFrame(df.id.tolist(),index=df.index)],axis=1)

Затем, используя melt с groupby rolling mean и stack, чтобы получить результат

newdf.reset_index().melt(['index','V']).set_index('index').sort_index().groupby('value').V.rolling(2, min_periods=2).mean().unstack(0)
Out[260]: 
value    a    b   c    d
index                   
0      NaN  NaN NaN  NaN
1      2.0  2.0 NaN  2.0
2      4.0  4.0 NaN  4.0
3      6.0  6.0 NaN  NaN
...