我有一个如下表(只是更长):
# time binary frequency
0 2.1 0 0.65
1 3.2 1 0.72
2 5.8 0 0.64
3 7.1 0 0.63
4 9.5 1 0.72
5 14.1 1 0.74
6 21.5 0 0.62
7 27.3 0 0.61
8 29.5 1 1.00
9 32.1 1 1.12
10 35.5 1 0.99
我想收集仅与binary == 1
相对应的所有时间
,以及小组中对应的频率
值更高。在上表中,这将导致:
times = 3.2, 14.1, 32.1
我不确定如何首先处理表的顺序,然后如何比较它们之间的值,仅返回对应的时间(而不是例如最大频率)。时间隐藏了周期性,因此我会避免构建另一个仅包含 binary == 1
元素的表。
有了我的时间
、二进制
和频率
数组,我可以通过以下方式隔离相关元素:
condition = (binary == 1)
time1 = time(condition)
frequency1 = frequency(condition)
但我不知道如何继续隔离各种条纹。我可以使用哪些有用的功能?
最佳答案
我不知道有什么巧妙的函数可以用于此目的。这是一些可以完成这项工作的代码。请注意,我从您的文件中删除了 header 。
binary
为零或一,具体取决于行中是否包含其他值。最初,in_group
设置为 False
以指示没有组已启动。读取行时,当 binary
为零时,如果代码已读取组的行,因此 in_group
为 True,则 in_group
设置为False
,因为现在遇到了零,该组就结束了。由于组的处理已经结束,是时候打印它的结果了。读取行时,当 binary
为 1 时,如果 in_group
为 True,则代码已经开始处理行是一组,并且代码检查是否是最新的 频率
比之前看到的要大。如果是这样,它会更新 rep_time
和 rep_Frequency
。如果 in_group
为 False,则这是新组的第一行,并且 in_group
设置为 True,并且 rep_time
和 rep_Frequency 的初始值
已设置。
with open('pyser.txt') as pyser:
in_group = False
for line in pyser:
_, time, binary, frequency = [float(_) for _ in line.rstrip().split()]
if binary == 0:
if in_group:
in_group = False
print (rep_time)
else:
if in_group:
if frequency > rep_frequency:
rep_time, rep_frequency = time, frequency
else:
in_group = True
rep_time, rep_frequency = time, frequency
if in_group:
print (rep_time)
输出:
3.2
14.1
32.1
编辑:我们似乎对问题使用了不同的定义。
在第一组中,我们同意。但是,在第二组中,最大幅度约为4.07E-01,对应的时间约为5.4740E+04。
我还在 Pandas 中编写了代码:
>>> import pandas as pd
>>> df = pd.read_csv('Gyd9P1rb.txt', sep='\s+', skiprows=2, header=None, names='Row TSTOP PSRTIME DETECTED FDOTMAX AMPLITUDE AMPLITUDE_ERR'.split())
>>> del df['Row']
>>> del df['TSTOP']
>>> del df['FDOTMAX']
>>> del df['AMPLITUDE_ERR']
>>> groups = []
>>> in_group = False
>>> group_number = 1
>>> for b in df['DETECTED']:
... if b:
... if not in_group:
... group_number +=1
... in_group = True
... groups.append(group_number)
... else:
... groups.append(0)
... in_group = False
...
>>> df['groups'] = pd.Series(groups, index=df.index)
>>> df.head()
PSRTIME DETECTED AMPLITUDE groups
0 54695.471283 1 0.466410 2
1 54698.532412 1 0.389607 2
2 54701.520814 1 0.252858 2
3 54704.557583 0 0.103460 0
4 54707.557563 0 0.088215 0
>>> gb = df.groupby(by=df['groups'])
>>> def f(x):
... the_max = x['AMPLITUDE'].idxmax()
... print ( x['groups'][the_max], x['PSRTIME'][the_max])
...
>>> gb.apply(f)
0 58064.3656376
0 58064.3656376
2 54695.4712834
3 54740.4917137
4 54788.477571
5 54836.472922
6 54881.4605511
7 54926.4664883
8 54971.4932866
9 55019.5021472
10 55064.5029133
11 55109.4948108
12 55154.414381
13 55202.488766
14 55247.4721132
15 55292.5301332
16 55340.4728542
17 55385.5229596
18 55430.5332147
19 55478.4812671
20 55523.4894451
21 55568.4626766
22 55616.4630348
23 55661.4969604
24 55709.4504634
25 55754.4711994
26 55799.4736923
27 55844.5050404
28 55892.4699313
29 55937.4721754
30 55985.4677572
31 56030.5119765
32 56075.5517149
33 56168.4447074
34 56213.507484
35 56306.5133063
36 56351.4943058
37 56396.579122
38 56441.5683651
39 56489.5321173
40 56534.4838082
41 56582.469025
42 56627.4135202
43 56672.4926625
44 56720.582296
45 56768.5232469
46 56813.4997925
47 56858.3890558
48 56903.5182596
49 56951.4892721
50 56996.5787435
51 57086.3948136
52 57179.5421833
53 57272.5059448
54 57362.452523
55 57635.5013047
56 57728.4925251
57 57773.5235416
58 57821.5390364
59 57866.5205882
60 57911.5590132
61 57956.5699637
62 58001.4331976
Empty DataFrame
Columns: []
Index: []
两种方法的结果是相同的,只是呈现精度不同。
我还创建了一小组数据,可以轻松计算结果。就是这个。原程序正确执行。
0 -1 0 -1
1 0 1 2
2 -1 0 -1
3 -1 0 -1
4 0 1 0
5 1 1 1
6 -1 0 -1
7 -1 0 -1
8 -1 0 -1
9 0 1 4
10 1 1 3
11 2 1 2
12 -1 0 -1
13 -1 0 -1
14 -1 0 -1
15 -1 0 -1
16 0 1 0
17 1 1 1
18 2 1 2
19 3 1 3
20 -1 0 -1
21 -1 0 -1
22 -1 0 -1
23 -1 0 -1
24 -1 0 -1
25 0 1 6
26 1 1 5
27 2 1 4
28 3 1 3
29 4 1 2
30 -1 0 -1
31 -1 0 -1
32 -1 0 -1
33 -1 0 -1
34 -1 0 -1
35 -1 0 -1
36 0 1 0
37 1 1 1
38 2 1 2
39 3 1 3
40 4 1 4
41 5 1 5
41 -1 0 -1
41 -1 0 -1
关于python-3.x - 解析具有二进制条纹的表以选择更大的组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915691/