python-3.x - 解析具有二进制条纹的表以选择更大的组元素

标签 python-3.x

我有一个如下表(只是更长):

#    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_timerep_Frequency。如果 in_group 为 False,则这是新组的第一行,并且 in_group 设置为 True,并且 rep_timerep_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

编辑:我们似乎对问题使用了不同的定义。

sample

在第一组中,我们同意。但是,在第二组中,最大幅度约为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/

相关文章:

python - 在输入提示中启用箭头键导航

python - 有没有更好的方法将字典转换为 [k1,v1,k2,va]?

python - 为什么属性属于内置重写描述符类型?

python - 如何在txt文件中查找字符串

python - 错误的 UDP 校验和无效 : why?

python-3.x - Python : Spacy and memory consumption

python - 在映射函数的列表推导式中传递命名参数

Python:如何使用 Plotly 堆叠或叠加直方图

python-3.x - 注释 Python3 中静态方法的返回类型

python - 如何以可靠的方式跟踪 python 对象的实例?