2017-02-24 44 views
4

我想创建一列中的值来自一列,但基于匹配另一列与以前的值。熊猫:找到匹配值的前一行

这里是我当前的代码:

d = {'a':[1,2,3,1,2,3,2,1], 'b':[10,20,30,40,50,60,70,80]} 

df = pd.DataFrame(d) 

df['c'] = df['b'][df['a'] == df['a'].prev()] 

而我想要的输出:

a b c 
0 1 10 NaN 
1 2 20 NaN 
2 3 30 NaN 
3 1 40 10 
4 2 50 20 
5 3 60 30 
6 2 70 50 
7 1 80 40 

...这我没有收到,因为.prev()是不是一个真实的东西。有什么想法吗?

回答

4

我们可以按a列,它默认排序值,然后 “附加” shiftedb列:

In [110]: df['c'] = df.groupby('a')['b'].transform(lambda x: x.shift()) 

In [111]: df 
Out[111]: 
    a b  c 
0 1 10 NaN 
1 2 20 NaN 
2 3 30 NaN 
3 1 40 10.0 
4 2 50 20.0 
5 3 60 30.0 
6 2 70 50.0 
7 1 80 40.0 

或者更好的选择 - using GroupBy.shift()(谢谢@Mitch

In [114]: df['c'] = df.groupby('a')['b'].shift() 

In [115]: df 
Out[115]: 
    a b  c 
0 1 10 NaN 
1 2 20 NaN 
2 3 30 NaN 
3 1 40 10.0 
4 2 50 20.0 
5 3 60 30.0 
6 2 70 50.0 
7 1 80 40.0 
+1

这很好!虽然“转化”是必要的吗? 'df.groupby('a')['b']。shift()' – miradulo

+0

@Mitch,哇,谢谢!我不知道我们可以使用'GroupBy.shift()' – MaxU

+1

@MaxU每当我发现这些方法存在于像GroupBy对象这样的东西时,感觉就像是神奇的:) – miradulo