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”列,并从表中“ c” =“ c + 1”和“ c-1”以及“ d + 1”,“ d-1”的其他位置添加更多“ z”列”,最后加入。最后,我希望行数相同,但是将“ 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

最佳答案

不知道我是否理解您,但是您可以使用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


但我认为,这真的是低效的

09-29 20:23