根据条件使用上一行值的矢量化方式

时间:2019-11-07 16:23:55

标签: python-3.x pandas

我有一个如下的pandas数据框。我要执行以下条件: 如果列“ A”为1,则将列“ F”的值更新为以前的值“ F”。可以逐行进行迭代,但这不是有效的方法。我想要这样做的向量化方法。

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

我想要的输出:

df = pd.DataFrame({'A':[1,1,1, 0, 0, 0, 1, 0, 0], 'C':[1,1,1, 0, 0, 0, 1, 1, 1], 'D':[1,1,1, 0, 0, 0, 1, 1, 1],
'F':[2,0,0, 0, 0, 1, 1, 1, 1]})
df

    A   C   D   F
0   1   1   1   2
1   1   1   1   0
2   1   1   1   0
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

我尝试了下面的代码,但是它不起作用,因为当我使用shift时,它不会占用更新的上一行。

    A   C   D   F
0   1   1   1   2
1   1   1   1   2
2   1   1   1   2
3   0   0   0   0
4   0   0   0   0
5   0   0   0   1
6   1   1   1   1
7   0   1   1   1
8   0   1   1   1

2 个答案:

答案 0 :(得分:2)

transform('first')

df.F.groupby(df.A.rsub(1).cumsum()).transform('first')

0    2
1    2
2    2
3    0
4    0
5    1
6    1
7    1
8    1
Name: F, dtype: int64

分配给列'F'

df.assign(F=df.F.groupby(df.A.rsub(1).cumsum()).transform('first'))

   A  C  D  F
0  1  1  1  2
1  1  1  1  2
2  1  1  1  2
3  0  0  0  0
4  0  0  0  0
5  0  0  0  1
6  1  1  1  1
7  0  1  1  1
8  0  1  1  1

答案 1 :(得分:1)

我们还知道如何在不使用groupby的情况下做到这一点:

DateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date date = new Date();
Logger.info(“current time is”,sdf.format(date));
// gives date in 2019-11-06 17:03:54
// dB gives following record
Date successDate = loader.getLastSuccess();
// gives date in 2019-10-31T:56:08.066+0000