Сортировать кадр данных Pandas по частоте и длине - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть информационный фрейм Pandas, который содержит список каскадов атмосферных рек (AR). Каждый AR имеет связанную дату (дату первоначального выхода на сушу), увеличенную на 6 часовых периодов времени. Этот список также включает в себя столбец, который сообщает, какое число AR в течение периода ~ 40 лет. Большинство 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 голосов
/ 12 сентября 2018

Вы можете использовать groupby, чтобы взять первое из каждого AR, затем join со счетчиком значений.Это означает, что ваш фрейм данных отсортирован по Year, затем Month, затем Day (сделано ниже с помощью 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
0 голосов
/ 12 сентября 2018

Звучит так, будто вы просто хотите, чтобы первое вхождение каждого уникального "числа 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...