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')]