gpt4 book ai didi

python - 在不迭代的情况下在 Pandas 系列中查找连续的、非唯一的切片

转载 作者:太空狗 更新时间:2023-10-30 01:13:23 25 4
gpt4 key购买 nike

我正在尝试解析我们制造过程的日志文件。大多数时候,该过程是自动运行的,但偶尔,工程师需要切换到手动模式进行一些更改,然后再切换回 react 器软件的自动控制。当设置为手动模式时,日志文件将步骤记录为“MAN.OP”。而不是一个数字。下面是一个代表性的例子。

steps = [1,2,2,'MAN.OP.','MAN.OP.',2,2,3,3,'MAN.OP.','MAN.OP.',4,4]
ser_orig = pd.Series(steps)

结果

0           1
1 2
2 2
3 MAN.OP.
4 MAN.OP.
5 2
6 2
7 3
8 3
9 MAN.OP.
10 MAN.OP.
11 4
12 4
dtype: object

我需要检测“MAN.OP”。并使它们彼此区别开来。在这个例子中,两个值 == 2 的区域在检测到手动模式部分后应该是一个区域,如下所示:

0                 1
1 2
2 2
3 Manual_Mode_0
4 Manual_Mode_0
5 2
6 2
7 3
8 3
9 Manual_Mode_1
10 Manual_Mode_1
11 4
12 4
dtype: object

我有代码迭代这个系列,并在系列传递给我的对象时产生正确的结果。 setter 是:

@step_series.setter
def step_series(self, ss):
"""
On assignment, give the manual mode steps a unique name. Leave
the steps done on recipe the same.
"""
manual_mode = "MAN.OP."
new_manual_mode_text = "Manual_Mode_{}"
counter = 0
continuous = False
for i in ss.index:
if continuous and ss.at[i] != manual_mode:
continuous = False
counter += 1

elif not continuous and ss.at[i] == manual_mode:
continuous = True
ss.at[i] = new_manual_mode_text.format(str(counter))

elif continuous and ss.at[i] == manual_mode:
ss.at[i] = new_manual_mode_text.format(str(counter))

self._step_series = ss

但这会遍历整个数据帧,并且是我的代码中除了通过网络读取日志文件之外最慢的部分。

如何在不遍历整个系列的情况下检测这些非唯一部分并唯一地重命名它们?该系列是从较大的数据框中选择的列,因此如果需要,添加额外的列就可以了。

对于我最终得到的完整答案:

@step_series.setter
def step_series(self, ss):
pd.options.mode.chained_assignment = None
manual_mode = "MAN.OP."
new_manual_mode_text = "Manual_Mode_{}"

newManOp = (ss=='MAN.OP.') & (ss != ss.shift())
ss[ss == 'MAN.OP.'] = 'Manual_Mode_' + (newManOp.cumsum()-1).astype(str)

self._step_series = ss

最佳答案

这是一种方法:

steps = [1,2,2,'MAN.OP.','MAN.OP.',2,2,3,3,'MAN.OP.','MAN.OP.',4,4]
steps = pd.Series(steps)

newManOp = (steps=='MAN.OP.') & (steps != steps.shift())
steps[steps=='MAN.OP.'] += seq.cumsum().astype(str)

>>> steps
0 1
1 2
2 2
3 MAN.OP.1
4 MAN.OP.1
5 2
6 2
7 3
8 3
9 MAN.OP.2
10 MAN.OP.2
11 4
12 4
dtype: object

要获得您列出的确切格式(从零开始而不是一个,并从“MAN.OP.”更改为“Manual_mode_”),只需调整最后一行:

steps[steps=='MAN.OP.'] = 'Manual_Mode_' + (seq.cumsum()-1).astype(str)

>>> steps
0 1
1 2
2 2
3 Manual_Mode_0
4 Manual_Mode_0
5 2
6 2
7 3
8 3
9 Manual_Mode_1
10 Manual_Mode_1
11 4
12 4
dtype: object

a pandas enhancement request对于连续的 groupby,这将使此类任务更简单。

关于python - 在不迭代的情况下在 Pandas 系列中查找连续的、非唯一的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com