2013-06-29 40 views
0

假设我创建了一个带有两列的熊猫数据框,其中一列包含一些数字,另一列包含字母。就像这样:当列y等于z时,pandas获得第x列的最后一个值。

import pandas as pd 
from pprint import pprint 

df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': ['y','x','y','x','y', 'y']}) 
pprint(df) 

    a b 
0 1 y 
1 2 x 
2 3 y 
3 4 x 
4 5 y 
5 6 y 

现在说,我要打第三列(c),其值等于a的最后一个值时b是等于x。在其中b还没有遇到x的值的情况下,c值应该默认为0。

的过程应该产生相当多的结果如下:

last_a = 0 
c = [] 
for i,b in enumerate(df['b']): 
    if b == 'x': 
     last_a = df.iloc[i]['a'] 
    c += [last_a] 

df['c'] = c 
pprint(df) 


    a b c 
0 1 y 0 
1 2 x 2 
2 3 y 2 
3 4 x 4 
4 5 y 4 
5 6 y 4 

是否有一个更优雅无论有或没有熊猫完成这个方法?

回答

2
In [140]: df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': ['y','x','y','x','y', 'y']}) 

In [141]: df 
Out[141]: 
    a b 
0 1 y 
1 2 x 
2 3 y 
3 4 x 
4 5 y 
5 6 y 

找到列'b'== x,然后返回该列中的值(而不是位置);此列已经是“一”列

In [142]: df['c'] = df.loc[df['b']=='x','a'].apply(lambda v: v if v < len(df) else np.nan) 

填充向前的值的其余部分,然后填充孔用0

In [143]: df['c'] = df['c'].ffill().fillna(0) 

In [144]: df 
Out[144]: 
    a b c 
0 1 y 0 
1 2 x 2 
2 3 y 2 
3 4 x 4 
4 5 y 4 
5 6 y 4 
相关问题