Pandas 中的条件转换

Condition Shift in Pandas

我正在尝试在序列更改期间计算一个数字。

当从负范围变为正范围时,数字始终为+1。

这里是代码:


data = {'a':  [-1,-1,-2,-3,4,5,6,-2,-2,-3,6,3,6,7,-1,-5,-7,1,34,5]}

df = pd.DataFrame (data)


df['p'] = df.a > 0
df['g'] = (df['p'] != df['p'].shift()).cumsum()

这是输出:

0  -1  False  1
1  -1  False  1
2  -2  False  1
3  -3  False  1
4   4   True  2
5   5   True  2
6   6   True  2
7  -2  False  3
8  -2  False  3
9  -3  False  3
10  6   True  4
11  3   True  4
12  6   True  4
13  7   True  4
14 -1  False  5

我需要如下所示的输出:

0  -1  False  1
1  -1  False  1
2  -2  False  1
3  -3  False  1
4   4   True  2
5   5   True  2
6   6   True  2
7  -2  False  2
8  -2  False  2
9  -3  False  2
10  6   True  3
11  3   True  3
12  6   True  3
13  7   True  3
14 -1  False  3

有人知道吗?

您可以通过 & 按位匹配掩码 AND:

df['p'] = df.a > 0
df['g'] = ((df['p'] != df['p'].shift()) & df['p']).cumsum() + 1

另一个想法是在 p 列中按掩码过滤,前向填充缺失值用第一组替换 NaN 并添加 1:

df['p'] = df.a > 0
df['g'] = ((df['p'] != df['p'].shift()))[df['p']].cumsum()
df['g'] = df['g'].ffill().fillna(0).astype(int) + 1

有差异的解决方案,没有助手 p 列:

df['g'] = df.a.gt(0).view('i1').diff().gt(0).cumsum().add(1)

print (df)
     a      p  g
0   -1  False  1
1   -1  False  1
2   -2  False  1
3   -3  False  1
4    4   True  2
5    5   True  2
6    6   True  2
7   -2  False  2
8   -2  False  2
9   -3  False  2
10   6   True  3
11   3   True  3
12   6   True  3
13   7   True  3
14  -1  False  3
15  -5  False  3
16  -7  False  3
17   1   True  4
18  34   True  4
19   5   True  4

你可以试试这个:

df["g"] = (df.p.astype(int).diff() > 0).astype(int).cumsum() + 1

输出:

     a      p  g
0   -1  False  1
1   -1  False  1
2   -2  False  1
3   -3  False  1
4    4   True  2
5    5   True  2
6    6   True  2
7   -2  False  2
8   -2  False  2
9   -3  False  2
10   6   True  3
11   3   True  3
12   6   True  3
13   7   True  3
14  -1  False  3
15  -5  False  3
16  -7  False  3
17   1   True  4
18  34   True  4
19   5   True  4

使用np.signdiffgtcumsum

s = np.sign(df.a)
df['g'] = s.diff().gt(0).cumsum() + 1

Out[255]:
     a      p  g
0   -1  False  1
1   -1  False  1
2   -2  False  1
3   -3  False  1
4    4   True  2
5    5   True  2
6    6   True  2
7   -2  False  2
8   -2  False  2
9   -3  False  2
10   6   True  3
11   3   True  3
12   6   True  3
13   7   True  3
14  -1  False  3
15  -5  False  3
16  -7  False  3
17   1   True  4
18  34   True  4
19   5   True  4