当列y等于z时,pandas获取列x的最后一个值

时间:2013-06-29 16:58:51

标签: python pandas

假设我创建了一个包含两列的pandas DataFrame,其中一列包含一些数字,另一列包含字母。像这样:

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等于x时,其值等于b的最后一个值。如果在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

使用或不使用pandas,是否有更优雅的方法来实现这一目标?

1 个答案:

答案 0 :(得分: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列的位置,然后返回该列中的值(不是位置);此列已经是'a'列

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