Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 垂直移动数据帧中的值_Python_Pandas_Shift - Fatal编程技术网

Python 垂直移动数据帧中的值

Python 垂直移动数据帧中的值,python,pandas,shift,Python,Pandas,Shift,我有一个熊猫数据框,看起来像这样: import pandas as pd d = {'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 'user': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',]} df = pd.DataFr

我有一个熊猫数据框,看起来像这样:

import pandas as pd
d = {'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 'user': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',]}
df = pd.DataFrame(data=d)
df

    value   user
    1       A
    2       A
    3       A
    4       A
    5       A
    6       A
    7       A
    8       A
    9       B
    10      B
    11      B
    12      B
    13      C
    14      C
    15      C
    16      C
    17      C
    18      C
    19      C
    20      C

我想为这个数据帧创建一个名为
value2
的新列,用
value
列中相同的值填充它,但行向上移动一行。每个
用户组的最后一行也应删除。在下面的示例中,您可以看到例如缺少值对
8-9

    value  value2      user
    1      2           A
    2      3           A
    3      4           A
    4      5           A
    5      6           A
    6      7           A
    7      8           A
    9      10          B
    10     11          B
    11     12          B
    13     14          C
    14     15          C
    15     16          C
    16     17          C
    17     18          C
    18     19          C
    19     20          C
我知道可以使用pandas的
shift()
函数来移动行,但它仍然不能提供所需的输出,如下面所示。解决方案似乎是删除每个
用户组的最后一行。。和更改列的顺序(用户列应为第三列)。有什么办法可以改进吗

df['value2'] = df['value'].shift(-1, fill_value=0)
df


    value   user    value2
    1       A       2
    2       A       3
    3       A       4
    4       A       5
    5       A       6
    6       A       7
    7       A       8
    8       A       9
    9       B       10
    10      B       11
    11      B       12
    12      B       13
    13      C       14
    14      C       15
    15      C       16
    16      C       17
    17      C       18
    18      C       19
    19      C       20
    20      C       0
使用并删除
-1
行:

df['next_node'] = df.groupby('user')['node'].shift(-1, fill_value=-1)

df = df[df['next_node'].ne(-1)]
print (df)
    node user  next_node
0      1    A          2
1      2    A          3
2      3    A          4
3      4    A          5
4      5    A          6
5      6    A          7
6      7    A          8
8      9    B         10
9     10    B         11
10    11    B         12
12    13    C         14
13    14    C         15
14    15    C         16
15    16    C         17
16    17    C         18
17    18    C         19
18    19    C         20
或由
用户在以下位置删除最后一行:


应删除每个
用户组的最后一行。在所需的输出中,您可以看到缺少节点对
8-9
12-13
20-21
。@sampeterson-答案已编辑。在较大的数据集上运行此代码时,我得到一个
值错误:无法从重复轴重新编制索引。有没有办法解决这个问题?
df['next_node'] = df.groupby('user')['node'].shift(-1, fill_value=-1)

df = df[df['user'].duplicated(keep='last')]