Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找每个序列的最大频率\u ID_Python_Python 3.x_Pandas_Numpy_List Comprehension - Fatal编程技术网

Python 查找每个序列的最大频率\u ID

Python 查找每个序列的最大频率\u ID,python,python-3.x,pandas,numpy,list-comprehension,Python,Python 3.x,Pandas,Numpy,List Comprehension,我有一个数据帧,如: Time Frq_1 Seq_1 Frq_2 Seq_2 Frq_3 Seq_3 12:43:04 - 30,668 - 30,670 4,620 30,671 12:46:05 - 30,699 - 30,699 3,280 30,700 12:46:17 4,200 30,700 -

我有一个数据帧,如:

Time         Frq_1   Seq_1       Frq_2   Seq_2       Frq_3   Seq_3
12:43:04     -       30,668      -       30,670      4,620   30,671 
12:46:05     -       30,699      -       30,699      3,280   30,700 
12:46:17     4,200   30,700      -       30,704      -       30,704 
12:46:18     3,060   30,700      4,200   30,700      -       30,700 
12:46:18     3,060   30,700      4,200   30,700      -       30,700 
12:46:19     3,060   30,700      4,220   30,700      -       30,700 
12:46:20     3,060   30,700      4,240   30,700      -       30,700 
12:46:37     -       30,698      -       30,699      3,060   30,700 
12:46:38     -       30,699      3,060   30,700      4,600   30,700 
12:47:19     -       30,668      -       30,669      -       30,669 
12:47:20     -       30,667      -       30,667      -       30,668 
12:47:20     -       30,667      -       30,667      -       30,668 
12:47:21     -       30,667      -       30,667      -       30,668 
12:47:21     -       30,665      -       30,665      -       30,665 
12:47:22     -       30,665      -       30,665      -       30,665 
12:48:35     -       30,688      -       30,690      3,020   30,690 
12:49:29     4,160   30,690      -       30,691      -       30,693 
我想检查总数据帧,并找到具有以下条件的结果:

  • 频率不为空的序列号
  • 频率最大的序列号(如果多个序列号的频率非零)
  • 我希望我的结果如下:

    Time         Sequence_ID    Frequency
    12:43:04     4,620          30,671 
    12:46:18     4,200          30,700 
    12:49:29     4,160          30,690 
    
    时间=对应于第行(序列号和频率)


    事实证明,这相当复杂。不管怎样,我们走吧:

    long_df = pd.wide_to_long(df.reset_index(), stubnames=['Seq_', 'Frq_'], 
                              suffix='\d+', i='index', j='j')
    long_df['Frq_'] = pd.to_numeric(long_df.Frq_.str.replace(',','.')
                                    .replace('-',float('nan')))
    long_df.reset_index(drop=True, inplace=True)
    ix = long_df.groupby('Seq_').Frq_.idxmax()
    

    似乎对于序列
    30700
    ,最高频率是
    4.60
    ,而不是
    4.20


    第一步是将数据帧折叠成三行,一行表示时间,另一行表示顺序和频率。我们可以使用
    pd.wide\u to_long
    和stubnames
    ['Seq\uu','Frq\uu']

    long_df = pd.wide_to_long(df.reset_index(), stubnames=['Seq_', 'Frq_'], 
                                  suffix='\d+', i='index', j='j')
    
    print(long_df)
    
                Time    Seq_   Frq_
    index j                         
    0     1  12:43:04  30,668      -
    1     1  12:46:05  30,699      -
    2     1  12:46:17  30,700  4,200
    3     1  12:46:18  30,700  3,060
    4     1  12:46:18  30,700  3,060
    5     1  12:46:19  30,700  3,060
    6     1  12:46:20  30,700  3,060
    7     1  12:46:37  30,698      -
    8     1  12:46:38  30,699      -
    9     1  12:47:19  30,668      -
    10    1  12:47:20  30,667      -
    11    1  12:47:20  30,667      -
    12    1  12:47:21  30,667      -
    13    1  12:47:21  30,665      -
    14    1  12:47:22  30,665      -
    15    1  12:48:35  30,688      -
    16    1  12:49:29  30,690  4,160
    ...
    
    下一步是将频率转换为浮点,以便能够找到最大值:

    long_df['Frq_'] = pd.to_numeric(long_df.Frq_.str.replace(',','.')
                                        .replace('-',float('nan')))
    
    print(long_df)
    
              Time    Seq_  Frq_
    index j                        
    0     1  12:43:04  30,668   NaN
    1     1  12:46:05  30,699   NaN
    2     1  12:46:17  30,700  4.20
    3     1  12:46:18  30,700  3.06
    4     1  12:46:18  30,700  3.06
    5     1  12:46:19  30,700  3.06
    6     1  12:46:20  30,700  3.06
    7     1  12:46:37  30,698   NaN
    ... 
    
    然后我们可以按
    Seq\uu
    分组,找到具有最高值的索引。您也可以考虑使用
    max
    ,但这将删除
    时间

    long_df.reset_index(drop=True, inplace=True)
    ix = long_df.groupby('Seq_').Frq_.idxmax()
    
    最后,根据上述内容编制索引:

    print(long_df.loc[ix[ix.notna()].values.astype(int)])
    
         Time      Seq_   Frq_
    34  12:43:04  30,671  4.62
    16  12:49:29  30,690  4.16
    42  12:46:38  30,700  4.60
    

    事实证明,这相当复杂。不管怎样,我们走吧:

    long_df = pd.wide_to_long(df.reset_index(), stubnames=['Seq_', 'Frq_'], 
                              suffix='\d+', i='index', j='j')
    long_df['Frq_'] = pd.to_numeric(long_df.Frq_.str.replace(',','.')
                                    .replace('-',float('nan')))
    long_df.reset_index(drop=True, inplace=True)
    ix = long_df.groupby('Seq_').Frq_.idxmax()
    

    似乎对于序列
    30700
    ,最高频率是
    4.60
    ,而不是
    4.20


    第一步是将数据帧折叠成三行,一行表示时间,另一行表示顺序和频率。我们可以使用
    pd.wide\u to_long
    和stubnames
    ['Seq\uu','Frq\uu']

    long_df = pd.wide_to_long(df.reset_index(), stubnames=['Seq_', 'Frq_'], 
                                  suffix='\d+', i='index', j='j')
    
    print(long_df)
    
                Time    Seq_   Frq_
    index j                         
    0     1  12:43:04  30,668      -
    1     1  12:46:05  30,699      -
    2     1  12:46:17  30,700  4,200
    3     1  12:46:18  30,700  3,060
    4     1  12:46:18  30,700  3,060
    5     1  12:46:19  30,700  3,060
    6     1  12:46:20  30,700  3,060
    7     1  12:46:37  30,698      -
    8     1  12:46:38  30,699      -
    9     1  12:47:19  30,668      -
    10    1  12:47:20  30,667      -
    11    1  12:47:20  30,667      -
    12    1  12:47:21  30,667      -
    13    1  12:47:21  30,665      -
    14    1  12:47:22  30,665      -
    15    1  12:48:35  30,688      -
    16    1  12:49:29  30,690  4,160
    ...
    
    下一步是将频率转换为浮点,以便能够找到最大值:

    long_df['Frq_'] = pd.to_numeric(long_df.Frq_.str.replace(',','.')
                                        .replace('-',float('nan')))
    
    print(long_df)
    
              Time    Seq_  Frq_
    index j                        
    0     1  12:43:04  30,668   NaN
    1     1  12:46:05  30,699   NaN
    2     1  12:46:17  30,700  4.20
    3     1  12:46:18  30,700  3.06
    4     1  12:46:18  30,700  3.06
    5     1  12:46:19  30,700  3.06
    6     1  12:46:20  30,700  3.06
    7     1  12:46:37  30,698   NaN
    ... 
    
    然后我们可以按
    Seq\uu
    分组,找到具有最高值的索引。您也可以考虑使用
    max
    ,但这将删除
    时间

    long_df.reset_index(drop=True, inplace=True)
    ix = long_df.groupby('Seq_').Frq_.idxmax()
    
    最后,根据上述内容编制索引:

    print(long_df.loc[ix[ix.notna()].values.astype(int)])
    
         Time      Seq_   Frq_
    34  12:43:04  30,671  4.62
    16  12:49:29  30,690  4.16
    42  12:46:38  30,700  4.60
    

    今后,我建议你尽量集中精力解决这个问题。这里发生了很多事情;数字没有存储为数字类型,缺少的数据没有正确表示,然后是您真正想要实现的逻辑。正如您所看到的,这些类型问题的答案被需要采取的所有预处理和外围步骤弄得一团糟,这使得这些问题对未来用户的用处大大降低。这会导致在这个问题上的票数下降,而且尽管付出了巨大的努力,答案往往得不到更多的赞成票。对不起。我已经按要求编辑了这个问题。今后,我建议你尽量集中精力解决这个问题。这里发生了很多事情;数字没有存储为数字类型,缺少的数据没有正确表示,然后是您真正想要实现的逻辑。正如您所看到的,这些类型问题的答案被需要采取的所有预处理和外围步骤弄得一团糟,这使得这些问题对未来用户的用处大大降低。这会导致在这个问题上的票数下降,而且尽管付出了巨大的努力,答案往往得不到更多的赞成票。对不起。我已按要求编辑了问题。对不起,先生,耽搁了。我已编辑该问题并更正了“-”和“,”值。事实上,我已经从excel中复制了这些值。特别是在提供了一个好答案方面做了大量的工作之后,改变这个问题并不是一个好的实践,因为现在我的答案似乎不能正确地解决您的问题。请发布一个新的问题和变化(一个单独的帖子),并接受这一个,因为它似乎解决了你的问题@RohitLambaKI非常抱歉,先生。我没有改变这个问题。刚刚更正了逗号和破折号的值。其他的都没变。对不起,先生,耽搁了。我已编辑该问题并更正了“-”和“,”值。事实上,我已经从excel中复制了这些值。特别是在提供了一个好答案方面做了大量的工作之后,改变这个问题并不是一个好的实践,因为现在我的答案似乎不能正确地解决您的问题。请发布一个新的问题和变化(一个单独的帖子),并接受这一个,因为它似乎解决了你的问题@RohitLambaKI非常抱歉,先生。我没有改变这个问题。刚刚更正了逗号和破折号的值。其他人则保持不变。