0

假设我创建了一个带有两列的 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),其值等于awhenb等于 x 的最后一个值。在b尚未遇到 x 值的情况下,值 inc应默认为 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

有没有更优雅的方法可以在有或没有熊猫的情况下完成此任务?

4

1 回答 1

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
于 2013-06-29T18:27:30.773 回答