Pandas Pivot стол ближайшего соседа

РЕШЕНИЕ

df = pd.read_csv('data.txt')
df['z-C+1'] = df.groupby(['a','b','d'])['z'].transform(lambda x:x.shift(+1))
df['z-C-1'] = df.groupby(['a','b','d'])['z'].transform(lambda x:x.shift(-1))
df['z-D+1'] = df.groupby(['a','b','c'])['z'].transform(lambda x:x.shift(+1))
df['z-D-1'] = df.groupby(['a','b','c'])['z'].transform(lambda x:x.shift(-1))

ВОПРОС

У меня есть CSV, который отсортирован по нескольким индексам. В частности, меня интересует один индекс, и я хочу, чтобы таблица оставалась неизменной. Все, что я хочу сделать, это добавить дополнительные столбцы, которые являются функцией таблицы. Итак, допустим, что "v" представляет интерес столбец. Я хочу взять столбец "z" и добавить больше столбцов "z" из других мест в таблице, где "c" = "c+1" и "c-1" и "d+1", "d-1", и просто присоединиться к тем, кто в конце. В конце я хочу получить такое же количество строк, но с расширением столбца "Z" до столбцов "ZC-1.D", "ZCD", "Z.C+1.D", "ZCD-1"., "ZCD+1". Если это имеет смысл. У меня трудности. Я попробовал метод pivot_table, и это меня куда-то привело, добавив при этом путаницу.

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

Вот мой пример CSV:

        a   b   c   d   v       z
        10  1   15  42  0.90    5460
        10  2   15  42  0.97    6500
        10  1   16  42  1.04    7540
        10  2   16  42  1.11    8580
        10  1   15  43  1.18    9620
        10  2   15  43  0.98    10660
        10  1   16  43  1.32    3452
        10  2   16  43  1.39    4561
        11  1   15  42  0.54    5670
        11  2   15  42  1.53    6779
        11  1   16  42  1.60    7888
        11  2   16  42  1.67    8997
        11  1   15  43  1.74    10106
        11  2   15  43  1.81    11215
        11  1   16  43  1.88    12324
        11  2   16  43  1.95    13433

И мой желаемый результат:

        a   b   c   d   v       z       z[c-1]  z[c+1]  z[d-1]  z[d+1]
        10  1   15  42  0.90    5460    Nan     7540    Nan     9620
        10  2   15  42  0.97    6500    Nan     8580    Nan     10660
        10  1   16  42  1.04    7540    5460    Nan     Nan     3452
        10  2   16  42  1.11    8580    6500    Nan     Nan     4561
        10  1   15  43  1.18    9620    Nan     3452    5460    Nan
        10  2   15  43  0.98    10660   Nan     4561    6500    Nan
        10  1   16  43  1.32    3452    9620    Nan     7540    Nan
        10  2   16  43  1.39    4561    10660   Nan     8580    Nan
        11  1   15  42  0.54    5670    Nan     7888    Nan     10106
        11  2   15  42  1.53    6779    Nan     8997    Nan     11215
        11  1   16  42  1.60    7888    5670    Nan     Nan     12324
        11  2   16  42  1.67    8997    6779    Nan     Nan     13433
        11  1   15  43  1.74    10106   Nan     12324   5670    Nan
        11  2   15  43  1.81    11215   Nan     13433   6779    Nan
        11  1   16  43  1.88    12324   10106   Nan     7888    Nan
        11  2   16  43  1.95    13433   11215   Nan     8997    Nan

1 ответ

Решение

Не знаю, понял ли я вас, но вы можете использовать shift() метод добавления смещенных столбцов, например:

df['z-1'] = df.groupby('a')['z'].transform(lambda x:x.shift(-1))

Обновить

Если вы хотите выбрать по значениям, вы можете использовать apply():

def lkp_data(c,d,v):
    d = df[(df['c'] == c) & (df['d'] == d) & (df['v'] == v)]['z']
    return None if len(d) == 0 else d.values[0]

df['z[c-1]'] = df.apply(lambda x: lkp_data(x['c'] - 1, x['d'], x['v']), axis=1)
df['z[c+1]'] = df.apply(lambda x: lkp_data(x['c'] + 1, x['d'], x['v']), axis=1)
df['z[d-1]'] = df.apply(lambda x: lkp_data(x['c'], x['d'] - 1, x['v']), axis=1)
df['z[d+1]'] = df.apply(lambda x: lkp_data(x['c'], x['d'] + 1, x['v']), axis=1)

    c   d      z  v  z[c-1]  z[c+1]  z[d-1]  z[d+1]
0  15  42   5460  1     NaN    7540     NaN    9620
1  15  42   6500  2     NaN    8580     NaN   10660
2  16  42   7540  1    5460     NaN     NaN    3452
3  16  42   8580  2    6500     NaN     NaN    4561
4  15  43   9620  1     NaN    3452    5460     NaN
5  15  43  10660  2     NaN    4561    6500     NaN
6  16  43   3452  1    9620     NaN    7540     NaN
7  16  43   4561  2   10660     NaN    8580     NaN

Но я думаю, что это было бы действительно неэффективно

Другие вопросы по тегам