【发布时间】:2016-05-31 04:58:00
【问题描述】:
我正在尝试解析我们制造过程的日志文件。大多数情况下,该过程是自动运行的,但偶尔,工程师需要切换到手动模式进行一些更改,然后再切换回反应堆软件的自动控制。当设置为手动模式时,日志文件将步骤记录为“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
我有代码迭代这个系列并在系列传递给我的对象时产生正确的结果。二传手是:
@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
【问题讨论】:
标签: python python-3.x pandas data-analysis