Python 最近邻数据透视表

Python 最近邻数据透视表,python,csv,pandas,pivot-table,import-from-csv,Python,Csv,Pandas,Pivot Table,Import From Csv,解决方案 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

解决方案

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))
问题

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”列扩展为“Z.C-1.D”、“Z.C.D”、“Z.C+1.D”、“Z.C.D-1”、“Z.C.D+1”列。如果这有意义的话。我有困难。我尝试了pivot_table方法,这给我带来了一些好处,同时也增加了困惑

如果这有帮助的话:把它想象成矩阵中的一个点,我有一个自变量&因变量。我想为我观察到的每个位置提取相邻的自变量

以下是我的示例:

        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()


但我认为,这个方法效率很低

不知道我是否理解您的意思,但您可以使用
shift()
方法添加移位列,如:

df['z-1'] = df.groupby('a')['z'].transform(lambda x:x.shift(-1))
更新 如果要按值进行选择,可以使用
apply()


但我认为,这一次的效率很低

你有任何期望输出的例子吗?你有任何期望输出的例子吗?谢谢。不完全是。但这很有趣。我编辑了评论以反映你的建议。哈哈,是的,你一直都是对的:-P进行了一些测试,但我现在明白了。非常感谢你!(如你所知,我对自己的问题感到困惑)@jakebrinkmann很乐意帮忙。为您原来的问题添加了解决方案谢谢。不完全是。但这很有趣。我编辑了评论以反映你的建议。哈哈,是的,你一直都是对的:-P进行了一些测试,但我现在明白了。非常感谢你!(如你所知,我对自己的问题感到困惑)@jakebrinkmann很乐意帮忙。为原始问题添加了解决方案