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

时间:2020-06-24 16:08:30

标签: python pandas

我今天here提出了类似的问题,我认为将其应用于组很容易,但是我发现这比我想象的要难。

所以,假设这是我的DataFrame:

   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,其中的值将是同一组中b的上一个值a中最后一个值 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 ,因此输出应为:

{{1}}

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

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