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非常抱歉,先生。我没有改变这个问题。刚刚更正了逗号和破折号的值。其他人则保持不变。