基于组的另一列中的值在一列中创建值

2024-05-20 05:58:53 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我问了一个类似的问题,我想把它应用到团体中会很容易,但我发现比我想象的要难

假设这是我的数据帧:

   group   a     b 
0    0    'a'    3
1    0    'a'    56
2    0    'b'    7
3    0    'b'    80  
4    0    'b'    55
5    0    'f'    601
6    0    'f'    -4
7    0    'g'    33
8    0    'g'    22
9    1    'a'    3
10   1    'a'    56
11   1    'b'    7
12   1    'b'    80  
13   1    'b'    55
14   1    'f'    601
15   1    'f'    -4
16   1    'g'    33
17   1    'g'    22

我想创建一个新列c,其中的值将是同一组中a的前一个值b的最后一个值,,因此输出应该是:

   group   a    b      c
0    0    'a'    3     nan
1    0    'a'    56    nan
2    0    'b'    7     56
3    0    'b'    80    56  
4    0    'b'    55    56
5    0    'f'    601   55
6    0    'f'    -4    55
7    0    'g'    33    -4
8    0    'g'    22    -4
9    1    'a'    3     nan
10   1    'a'    56    nan
11   1    'b'    7     56
12   1    'b'    80    56  
13   1    'b'    55    56
14   1    'f'    601   55
15   1    'f'    -4    55
16   1    'g'    33    -4
17   1    'g'    22    -4

任何帮助都将不胜感激


Tags: 数据groupnan想象团体
1条回答
网友
1楼 · 发布于 2024-05-20 05:58:53

如果您的数据没有重复的索引,这将起作用:

groups = df.groupby('group')
df['c'] = df.loc[df['a']!=groups['a'].shift(-1),'b']
df['c'] = groups['c'].ffill()
df['c'] = groups['c'].shift()

输出:

    group    a    b     c
0       0  'a'    3   NaN
1       0  'a'   56   NaN
2       0  'b'    7  56.0
3       0  'b'   80  56.0
4       0  'b'   55  56.0
5       0  'f'  601  55.0
6       0  'f'   -4  55.0
7       0  'g'   33  -4.0
8       0  'g'   22  -4.0
9       1  'a'    3   NaN
10      1  'a'   56   NaN
11      1  'b'    7  56.0
12      1  'b'   80  56.0
13      1  'b'   55  56.0
14      1  'f'  601  55.0
15      1  'f'   -4  55.0
16      1  'g'   33  -4.0
17      1  'g'   22  -4.0

如果您的数据具有重复索引(如示例所示),则可以执行以下操作:

# save the index
idx = df.index

# remove the index
df = df.reset_index(drop=True)

groups = df.groupby('group')
df['c'] = df.loc[df['a']!=groups['a'].shift(-1),'b']
df['c'] = groups['c'].ffill()
df['c'] = groups['c'].shift()

# put the index back
df.index = idx

相关问题 更多 >