【问题标题】:Find Max Frequency for every Sequence_ID查找每个 Sequence_ID 的最大频率
【发布时间】:2020-01-25 21:04:25
【问题描述】:

我有一个像这样的数据框:

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 

我想检查总数据框并找到以下条件的结果:

  1. Frequency 不为空的Sequence_ID
  2. Frequency 为 Max 的 Sequence_ID(在多个 Sequence_ID 的频率非零的情况下)

我希望我的结果如下:

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 

时间 = 对应于 (Sequence_ID & Frequency) 的行

【问题讨论】:

  • 以后,我建议您尽可能多地关注问题。这里发生了很多;未存储为数字类型的数字,未正确表示的缺失数据,然后是您真正想要实现的逻辑。正如您所看到的,这些类型的问题的答案被所有需要采取的预处理和外围步骤弄糊涂了,这使得这些问题对未来用户的用处大大降低。这会导致对该问题投反对票,并且尽管需要付出巨大的努力,但答案往往没有得到尽可能多的赞成票。
  • 对不起。我已根据需要编辑了问题。

标签: python python-3.x pandas numpy list-comprehension


【解决方案1】:

事实证明这非常复杂。无论如何,我们继续:

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()

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

好像对于序列30,700,频率最高的是4.60,而不是4.20


第一步是将数据框折叠成三行,一行用于Time,另一行用于序列和频率。我们可以将pd.wide_to_long 与存根名称['Seq_', 'Frq_'] 一起使用:

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
...

下一步是将频率浮点数转换为float,以便能够找到最大值:

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_ 分组并找到具有最高值的索引。也可以考虑使用max,但这会删除Time 列。

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 中复制了值。
  • 特别是在提供了一个好的答案方面付出了这么多的工作,更改问题并不是一个好的做法,因为现在我的回答似乎无法正确解决您的问题问题。请发布一个包含更改的新问题(单独的帖子),并接受这个问题,因为它似乎可以解决您的问题@RohitLambaK
  • 非常抱歉先生。我没有改变问题。刚刚更正了逗号和破折号值。其他人保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多