Разделите на урны с пандами - PullRequest
4 голосов
/ 19 марта 2019

У меня есть датафрейм в пандах, который выглядит как ниже.Индекс - объект даты и времени, упорядоченный по дням, разделенный на 5-минутные ячейки.У меня есть столбец с именем «col1».Поэтому, если я сделаю

df['col1']

, я получу:

DateTime
2008-04-28 09:40:00     300.0
2008-04-28 09:45:00    -800.0
2008-04-28 09:50:00       0.0
2008-04-28 09:55:00    -100.0
2008-04-28 10:00:00       0.0    
2008-04-29 09:40:00     500.0
2008-04-29 09:45:00     800.0
2008-04-29 09:50:00     100.0
2008-04-29 09:55:00    -100.0
2008-04-29 10:00:00       0.0

У меня есть другой кадр данных в пандах, полученный с помощью groupby в исходном кадре данных с использованием

df2 = df([df.index.time])[['col2']].mean()    

, который выводит:

           col2
09:40:00   4603.585657
09:45:00   5547.011952
09:50:00   8532.007952
09:55:00   6175.298805
10:00:00   4236.055777

Что я хотел бы сделать, это разделить col1 на col2 для каждого из 5-минутных интервалов без использования цикла for.Чтобы объяснить лучше, для всех дней, для каждого мусорного ведра разделите col1 на col2.Например, разделите все значения 9:40:00 в столбце col1 на значение 9:40:00 в столбце col2.

Я понятия не имею, как начать делать это без цикла for, но у меня сложилось впечатление, чтоэто должно быть выполнимо с пандами.

Ожидаемый результат:

DateTime
2008-04-28 09:40:00     300.0/4603.585657
2008-04-28 09:45:00    -800.0/5547.011952
2008-04-28 09:50:00       0.0/8532.007952
2008-04-28 09:55:00    -100.0/6175.298805
2008-04-28 10:00:00       0.0/4236.055777  
2008-04-29 09:40:00     500.0/4603.585657
2008-04-29 09:45:00     800.0/5547.011952
2008-04-29 09:50:00     100.0/8532.007952
2008-04-29 09:55:00    -100.0/6175.298805
2008-04-29 10:00:00       0.0/4236.055777

1 Ответ

1 голос
/ 19 марта 2019

Если нужно, разделите на времена:

df['new'] = df['col1'].div(df.groupby(df.index.time)['col1'].transform('mean'))
print (df)
                      col1   new
DateTime                        
2008-04-28 09:40:00  300.0  0.75
2008-04-28 09:45:00 -800.0  -inf
2008-04-28 09:50:00    0.0  0.00
2008-04-28 09:55:00 -100.0  1.00
2008-04-28 10:00:00    0.0   NaN
2008-04-29 09:40:00  500.0  1.25
2008-04-29 09:45:00  800.0   inf
2008-04-29 09:50:00  100.0  2.00
2008-04-29 09:55:00 -100.0  1.00
2008-04-29 10:00:00    0.0   NaN

Или, если нужно, разделите на дни:

df['new'] = df['col1'].div(df.groupby(df.index.date)['col1'].transform('mean'))
print (df)
                      col1       new
DateTime                            
2008-04-28 09:40:00  300.0 -2.500000
2008-04-28 09:45:00 -800.0  6.666667
2008-04-28 09:50:00    0.0 -0.000000
2008-04-28 09:55:00 -100.0  0.833333
2008-04-28 10:00:00    0.0 -0.000000
2008-04-29 09:40:00  500.0  1.923077
2008-04-29 09:45:00  800.0  3.076923
2008-04-29 09:50:00  100.0  0.384615
2008-04-29 09:55:00 -100.0 -0.384615
2008-04-29 10:00:00    0.0  0.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...