Python панды: дифференцирование всех временных рядов во фрейме данных по группам без переменной даты - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы дифференцировать все столбцы во фрейме данных Pandas по переменной группировки без дифференцирования даты.Вот воспроизводимый пример:

test_df = pd.DataFrame(data = {
        'date': pd.date_range(start = '2018-10-01', periods = 10),
        'group': sum([np.repeat('a', 5).tolist(),
                      np.repeat('b', 5).tolist()], []),
        'var1': [1, 3, 4, 6, 8, 10, 11, 14, 8, 10],
        'var2': np.random.random(size=10)
        })

Код:

test_df.groupby(['group']).diff()

не удовлетворяет предположениям, поскольку он дифференцирует столбец date вместе с var1 и var2.Я нашел такое решение:

var_names = ['var1', 'var2']
test_df[[('diff.' + var + '.1') for var in var_names]] = (test_df
       .groupby(['group'])[var_names].diff())
test_df

        date group  var1      var2  diff.var1.1  diff.var2.1
0 2018-10-01     a     1  0.237615          NaN          NaN
1 2018-10-02     a     3  0.652502          2.0     0.414887
2 2018-10-03     a     4  0.676830          1.0     0.024328
3 2018-10-04     a     6  0.047120          2.0    -0.629710
4 2018-10-05     a     8  0.047494          2.0     0.000374
5 2018-10-06     b    10  0.447973          NaN          NaN
6 2018-10-07     b    11  0.428788          1.0    -0.019185
7 2018-10-08     b    14  0.046168          3.0    -0.382620
8 2018-10-09     b     8  0.805820         -6.0     0.759651
9 2018-10-10     b    10  0.329497          2.0    -0.476323

Есть ли способ сделать это проще (с меньшим количеством кода или с более читаемым кодом)?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вариация на тему:

cols = ['var1','var2']
new_cols = [f'diff.{thing}.1' for thing in cols]

gb = test_df.groupby('group')
test_df[new_cols] = gb[cols].diff()
0 голосов
/ 15 мая 2018
  1. Используя pd.Index.difference, вам не нужно вручную указывать столбцы, которые нужно использовать, просто укажите исключаемые столбцы.
  2. Добавьте префикс diff. к каждому имени столбца, используя DataFrame.add_prefix
  3. Используйте DataFrame.add_suffix для добавления суффикса .1
  4. Наконец, используйте pd.concat, чтобы объединить их

cols = test_df.columns.difference(['group', 'date']).tolist()
v = test_df.groupby('group')[cols].diff().add_prefix('diff.').add_suffix('.1')

df = pd.concat([test_df, v], axis=1)

df
        date group  var1      var2  diff.var1.1  diff.var2.1
0 2018-10-01     a     1  0.861522          NaN          NaN
1 2018-10-02     a     3  0.677932          2.0    -0.183591
2 2018-10-03     a     4  0.232214          1.0    -0.445718
3 2018-10-04     a     6  0.148613          2.0    -0.083600
4 2018-10-05     a     8  0.119071          2.0    -0.029542
5 2018-10-06     b    10  0.279673          NaN          NaN
6 2018-10-07     b    11  0.711369          1.0     0.431696
7 2018-10-08     b    14  0.396185          3.0    -0.315184
8 2018-10-09     b     8  0.515509         -6.0     0.119324
9 2018-10-10     b    10  0.319519          2.0    -0.195990

В качестве альтернативы, для более эффективного решения вы можете использовать pd.Index.map для шага переименования:

v = test_df.groupby('group')[cols].diff()
v.columns = v.columns.map(lambda x: 'diff.' + x + '.1')
...