如何根据另一列的两个连续值在熊猫的新列中添加标签?

时间:2021-01-27 00:09:51

标签: python pandas

我有一个数据框 df,只有一列 extension
extension 列中的值循环增加和减少,如下所示:

extension
0.000
0.050
0.100
0.150
0.130
0.080
0.020
0.050
0.075

我正在尝试标记每个增加和减少的循环,如下所示:

extension lablel
0.000      1
0.050      1
0.100      1
0.150      1
0.130      1
0.080      1
0.020      1
0.050      2
0.075      2

我有点卡住了,希望得到一些指导。

2 个答案:

答案 0 :(得分:1)

getSecret().then(secret => {
  const strategy = new OAuth2Strategy({
    secret: secret
  }, function (accessToken, refreshToken, params, profile, done) {
    done(null,{data: 'some user data'});
  })


  passport.use('oauth2', strategy);
  refresh.use('oauth2', strategy);

  app.get('/my_route', async function (req, res) {
    ...
  })
})

答案 1 :(得分:1)

那么让我们重现您的数据:

a = [0.000,0.050,0.100,0.150,0.130,0.080,0.020,0.050,0.075]
df = pd.DataFrame(a, columns=["extension"])

简短的回答是:

df["label"] = pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff().abs().cumsum() + 1
df.at[0,"label"] = 1

至少这是我的答案。但它绝对看起来有点笨重。所以让我们分解一步一步地理解:

df["extension"].diff()

diff 创建每个单元格与前一个单元格之间的差异。因此它无法为第一个元素计算它。

输出:

0      NaN
1    0.050
2    0.050
3    0.050
4   -0.020
5   -0.050
6   -0.060
7    0.030
8    0.025

现在让我们二值化结果以检测正/负差异的变化,使用来自 numpy 的 where

np.where(df["extension"].diff() < 0, 0, 1)

输出:

array([1, 1, 1, 1, 0, 0, 0, 1, 1])

这告诉我们与之前的差异是负数 (--> 0) 还是正数 (--> 1)

那么您只想知道正/负趋势何时发生变化。因此,我们再次合并了 diff 函数。事先我们必须将 numpy 数组转换回 pd.Series:

pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff()

输出:

0    NaN
1    0.0
2    0.0
3    0.0
4   -1.0
5    0.0
6    0.0
7    1.0
8    0.0

最终,您对趋势改变的方向不感兴趣,只对它改变感兴趣,因此我们使用 abs 函数删除此信息。然后将结果与 cumsum 函数相加,以便它可以在每次更改时增加:

pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff().abs().cumsum()

输出:

0    NaN
1    0.0
2    0.0
3    0.0
4    1.0
5    1.0
6    1.0
7    2.0
8    2.0

最后添加两个以 1 而不是 0 为基础的标签,并替换为 NaN 的第一个项目: 代码后面的 +1 和 df.at[0,"label"] = 1

就这样:

         extension  label
    0      0.000    1.0
    1      0.050    1.0
    2      0.100    1.0
    3      0.150    1.0
    4      0.130    2.0
    5      0.080    2.0
    6      0.020    2.0
    7      0.050    3.0
    8      0.075    3.0

编辑:在评论中回答已编辑的问题