按频率和长度对熊猫数据框进行排序

时间:2018-09-12 16:16:00

标签: python pandas

我有一个Pandas数据框,其中包含大气河流(AR)登陆清单。每个AR都有一个关联的日期(首次登陆的日期),以6小时为周期递增。此列表还包括一列,该列告诉您在整个40年的时间内AR的数量。大多数AR的持续时间超过一个6小时时间段,因此在该时间段内具有相同数量的AR。就我而言,我想按AR的持续时间排序,同时保持AR首次登陆。

number of AR   Year   Month   Day   Hour 
1651           1979   1       5     18
1651           1979   1       6     0
1651           1979   1       6     06
1651           1979   1       6     12
1651           1979   1       6     18
1652           1979   1       8     06
1652           1979   1       8     12
1652           1979   1       8     18

理想情况下,我会有一个新的数据框,看起来像这样:

number of AR     Frequency    Year   Month   Day   Hour 
1651             5            1979   1       5     18
1652             3            1979   1       8     6

2 个答案:

答案 0 :(得分:1)

像您这样的声音,只是希望每个唯一的“ AR数量”的首次出现加上与之相关的长度。

df.groupby('number of AR').first().merge(
df.groupby('number of AR').apply(len).rename("Frequency").to_frame(), 
left_on='number of AR', right_index=True)

#            Year   Month   Day Hour    Frequency
#number of AR                   
#1651       1979    1       5   18      5
#1652       1979    1       8   6       3

如果您实际上不想要第一个,则应首先在调用.first()之前按您关心的值进行排序。

答案 1 :(得分:1)

您可以使用groupby取每个AR中的第一个,然后取join中的值计数。这意味着您的数据帧将按Year,然后依次按MonthDay(以下用sort_values完成)排序:

new_df = df.sort_values(['Year','Month', 'Day']).groupby(['number of AR']).first()

new_df = new_df.join(df['number of AR'].value_counts().to_frame('frequency'))


>>> new_df
              Year  Month  Day  Hour  frequency
number of AR                                   
1651          1979      1    5    18          5
1652          1979      1    8     6          3