【问题标题】:Determining a cell value based on previous/next cell value(s)根据上一个/下一个单元格值确定一个单元格值
【发布时间】:2019-05-02 08:49:32
【问题描述】:

这是我之前帖子的后续:Change multiple cell values based on other cell value(s)

这是一个对象的正常循环的样子:

                   DateTime  limitswitchopen  limitswitchclose  safetyedgeclose  safetyedgeopen  photocells  traploopext  rectloopext         moving                  comment
0   2018-11-12 15:04:46.861                0                 1                0               0           0            0            0          close                      NaN
1   2018-11-12 15:04:57.149                0                 1                0               0           0            0            0          close                      NaN
2   2018-11-12 15:05:05.046                0                 1                0               0           0            0            0          close                  Normaal
3   2018-11-12 15:05:06.859                0                 0                0               0           0            0            0   movingToopen                  Normaal
4   2018-11-12 15:05:10.080                0                 0                0               0           0            0            0   movingToopen                  Normaal
5   2018-11-12 15:05:11.801                1                 0                0               0           0            0            0           open                  Normaal
6   2018-11-12 15:05:13.409                1                 0                0               0           0            0            0           open                  Normaal
7   2018-11-12 15:05:17.142                1                 0                0               0           0            1            0           open                  Normaal
8   2018-11-12 15:05:18.754                1                 0                0               0           0            1            0           open                  Normaal
9   2018-11-12 15:05:19.055                1                 0                0               0           0            0            1           open                  Normaal
10  2018-11-12 15:05:19.763                1                 0                0               0           0            0            1           open                  Normaal
11  2018-11-12 15:05:20.367                1                 0                0               0           0            0            0           open                  Normaal
12  2018-11-12 15:05:21.575                0                 0                0               0           0            0            0  movingToclose                  Normaal
13  2018-11-12 15:05:23.385                0                 0                0               0           0            0            0  movingToclose                  Normaal
14  2018-11-12 15:05:26.505                0                 1                0               0           0            0            0          close                  Normaal
15  2018-11-12 15:05:26.906                0                 1                0               0           0            0            0          close                      NaN

我需要知道物体在朝哪个方向移动。所以我做的是

df['moving] = df[(df.limitswitchclose == 0) & (df.limitswitchopen == 0)] df['open'] = df[(dfsamen.limitswitchclose == 0) & (df.limitswitchopen == 1)] df['close'] = df[(dfsamen.limitswitchclose == 1) & (df.limitswitchopen == 0)]

我将其合并为一列,然后发表上一篇文章。 然后我使用该代码在显示方向的上方创建数据框。在这种情况下有效。但是当循环被中断时,方向会根据打开/关闭期间的中断而改变。

                   DateTime  limitswitchopen  limitswitchclose  safetyedgeclose  safetyedgeopen  photocells  traploopext  rectloopext         moving                  comment
41  2018-11-12 15:06:09.931                0                 1                0               0           0            0            0          close             Fotocellopen
42  2018-11-12 15:06:11.944                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
43  2018-11-12 15:06:13.756                0                 0                0               0           1            0            0  movingToclose             Fotocellopen
44  2018-11-12 15:06:15.168                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
45  2018-11-12 15:06:18.388                0                 1                0               0           0            0            0          close             Fotocellopen
46  2018-11-12 15:06:20.100                0                 0                0               0           0            0            0   movingToopen             Fotocellopen
47  2018-11-12 15:06:23.316                0                 0                0               0           0            0            0   movingToopen             Fotocellopen
48  2018-11-12 15:06:25.730                1                 0                0               0           0            0            0           open             Fotocellopen
49  2018-11-12 15:06:26.637                1                 0                0               0           0            0            0           open             Fotocellopen
50  2018-11-12 15:06:27.644                1                 0                0               0           0            1            0           open             Fotocellopen
51  2018-11-12 15:06:28.550                1                 0                0               0           0            1            1           open             Fotocellopen
52  2018-11-12 15:06:28.855                1                 0                0               0           0            0            1           open             Fotocellopen
53  2018-11-12 15:06:29.356                1                 0                0               0           0            0            0           open             Fotocellopen
54  2018-11-12 15:06:30.563                1                 0                0               0           0            0            0           open             Fotocellopen
55  2018-11-12 15:06:31.369                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
56  2018-11-12 15:06:32.575                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
57  2018-11-12 15:06:35.593                0                 1                0               0           0            0            0          close             Fotocellopen

43 2018-11-12 15:06:13.756photocells = 1 这将使对象关闭,然后再次开始打开。

那么这个数据框应该是什么:

                   DateTime  limitswitchopen  limitswitchclose  safetyedgeclose  safetyedgeopen  photocells  traploopext  rectloopext         moving                  comment
41  2018-11-12 15:06:09.931                0                 1                0               0           0            0            0          close             Fotocellopen
42  2018-11-12 15:06:11.944                0                 0                0               0           0            0            0   movingToopen             Fotocellopen
43  2018-11-12 15:06:13.756                0                 0                0               0           1            0            0   movingToopen             Fotocellopen
44  2018-11-12 15:06:15.168                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
45  2018-11-12 15:06:18.388                0                 1                0               0           0            0            0          close             Fotocellopen
46  2018-11-12 15:06:20.100                0                 0                0               0           0            0            0   movingToopen             Fotocellopen
47  2018-11-12 15:06:23.316                0                 0                0               0           0            0            0   movingToopen             Fotocellopen
48  2018-11-12 15:06:25.730                1                 0                0               0           0            0            0           open             Fotocellopen
49  2018-11-12 15:06:26.637                1                 0                0               0           0            0            0           open             Fotocellopen
50  2018-11-12 15:06:27.644                1                 0                0               0           0            1            0           open             Fotocellopen
51  2018-11-12 15:06:28.550                1                 0                0               0           0            1            1           open             Fotocellopen
52  2018-11-12 15:06:28.855                1                 0                0               0           0            0            1           open             Fotocellopen
53  2018-11-12 15:06:29.356                1                 0                0               0           0            0            0           open             Fotocellopen
54  2018-11-12 15:06:30.563                1                 0                0               0           0            0            0           open             Fotocellopen
55  2018-11-12 15:06:31.369                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
56  2018-11-12 15:06:32.575                0                 0                0               0           0            0            0  movingToclose             Fotocellopen
57  2018-11-12 15:06:35.593                0                 1                0               0           0            0            0          close             Fotocellopen

所以我需要一种方法来确定对象是打开还是关闭。 如果limitswitchclose 从1 变为0,它将始终打开,如果limitswitchopen 从1 变为0,它将始终关闭。但基于 df 中的其他列,它可以改变方向。如果在打开过程中safetyedgeopen = 1 将再次关闭。但是如果traploopext = 1 在打开期间它将继续打开。

我该如何解决这个问题?

(如果可行,我将继续尝试解决它并发布我的答案,我可以提供更多示例说明我希望数据框的外观,但帖子越来越长)

【问题讨论】:

  • 请删除您的问题不需要的列。在您的示例DataFrame 中,我至少计算了 5 列对于解决您的问题不是必需的。

标签: python pandas dataframe


【解决方案1】:

如果我理解您的主要问题,那就是“如何根据前一行的值分配值”。我这样做的方法是将过滤条件简单地移动一行。我不会给出所有选项的解决方案,但您可以适当扩展过滤条件。

这行代码过滤了相邻行在光电管中的值为 1 的位置,如果是这种情况,则将当前行“tomoving”替换为“toclosing”,或“toclosing”替换为“tomoving”

df.loc[df.shift(1).photocells==1,'moving'] = df.loc[df.shift(1).photocells==1,'moving'].str.replace('Toclose','To_open').str.replace('Toopen','To_close').str.replace('_','')

【讨论】:

  • 是否可以为 df shift 添加更多条件?例如df.loc[df.shift(1).photocells==1,'moving', dfshift(1).moving=='close', 'moving'] = df.loc[df.shift(1).photocells==1,'moving'].str.replace('Toclose','To_open').str.replace('Toopen','To_close').str.replace('_','')
  • 你的意思是你想要光电管==1 以及移动=='close'?在这种情况下,您可以使用& 添加更多过滤器,注意每个语句都必须在() 内,例如df.loc[(df.condition1) & (df.condition2),'moving'] 在这种情况下,您可以将条件分配给变量,以便 filtering = (df.shift(1).photocells==1) & (df.shift(1).moving=='close') 然后按它过滤:df.loc[filtering,'moving'] = df.loc[filtering,'moving'].str.replace('Toclose','To_open').str.replace('Toopen','To_close').str.replace('_','')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多