Pandas. Каков наилучший способ «сдвинуть» значения n внешних строк в значения предыдущих строк? (умножение столбцов-1) - PullRequest
0 голосов
/ 17 марта 2020

В первом случае группировка строк - это две , но идея состоит в том, чтобы обобщить ее для группировки N строк.

Идея состоит в том, чтобы превратить это:

df

    x1  x2  x3  y
0   1   2   3   NaN
1   5   6   7   8
2   9   10  11  12
3   13  14  15  16
4   17  18  19  NaN

в это:

df_grouped2
    x1  x2  x3  x4  x5  x6  y
0   1   2   3   5   6   7   8
1   5   6   7   9   10  11  12
2   9   10  11  13  14  15  16
3   13  14  15  17  18  19  NaN

Если мы сгруппируем оригинальный df из 3 строк, получим:

df_grouped3


    x1  x2  x3  x4  x5  x6  x7  x8  x9  y
0   1   2   3   5   6   7   9   10  11  12
1   5   6   7   9   10  11  13  14  15  16
2   9   10  11  13  14  15  17  18  19  NaN

Я не могу найти функцию или способ сделать это. Я пытаюсь создать функцию, чтобы сделать это, но идеи, которые приходят мне в голову, итеративно и исчерпывающе (цикл по всему набору данных).

Я не знаю, может ли какая-то комбинация функций pandas, таких как "pivot" или "shift", быть выполнена более простым способом .

Какая-то идея?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

@ Noname cpp

Спасибо! Хороший подход, следуя этой идее, я попытался обобщить это в функцию, но у меня есть проблема, и я не вижу решения.

Когда я запускаю функцию для более чем двух группировок строк, вывод генерирует неверно столбцы (с ненужными значениями строк).

Функция:

def move(df,row_agruped):

    while row_agruped > 2:
        df = move(df,2)
        row_agruped = row_agruped-1

    x = df
    z = x.shift(-1)

    num_cols = len(x.columns)

    rng = range(num_cols, num_cols-1 +((num_cols)))


    new_cols = ['x'+str(i) for i in rng] + ['y']

    z.columns = new_cols

    xt = x.iloc[:,:len(x.columns)-1]

    return pd.concat([xt,z],axis=1,sort=False).iloc[:((row_agruped)-3)]

Для N = 3 функция возвращает следующее:

move(x,3)


    x1  x2  x3  x4    x5    x6    x7    x8    x9    x10     x11     x12    y
0   1   2   3   5.0   6.0   7.0   5.0   6.0   7.0   9.0     10.0    11.0   12
1   5   6   7   9.0   10.0  11.0  9.0   10.0  11.0  13.0    14.0    15.0   16
2   9   10  11  13.0  14.0  15.0  13.0  14.0  15.0  17.0    18.0    19.0   NaN

(Обратите внимание на ошибки в столбцах x4 == x7, x5 == x8, x6 == x9)

Но он должен вернуть это:

    x1  x2  x3  x4      x5      x6      x7      x8      x9      y
0   1   2   3   5.0     6.0     7.0     9.0     10.0    11.0    12
1   5   6   7   9.0     10.0    11.0    13.0    14.0    15.0    16
2   9   10  11  13.0    14.0    15.0    17.0    18.0    19.0    NaN
0 голосов
/ 17 марта 2020

Пусть x будет исходным фреймом данных,

z = x.shift(-1)
z.columns = ['x4','x5','x6','y']
col = set(x.columns)
col.remove('y')
xt = x[col]
pd.concat([xt,z],axis=1,sort=False).iloc[:-1]

Для N = 3:

z2 = x.shift(-2)
z2.columns = ['x7','x8','x9','y']
col = set(z.columns)
col.remove('y')
zt = z[col]
pd.concat([xt,zt,z2],axis=1,sort=False).iloc[:-2]

Примечание. Для поколения N используйте x.shift (-1 ), от x.shift (-2) до x.shift (- (N-1)), вы можете реализовать это, используя для l oop

...