2015-11-04 3 views
1

Я выравнивая два dataframes который выглядеть следующим образом:Aligning Dataframes на основе подсчета на панд

  1. Dataframe 1

    Timestamp L_x L_y L_a  R_x  R_y  R_a 
    2403950 621.3 461.3 313  623.3 461.8 260 
    2404050 622.5 461.3 312  623.3 462.6 260 
    2404150 623.1 461.5 311  623.4 464  261 
    2404250 623.6 461.7 310  623.7 465.4 261 
    2404350 623.8 461.5 309  623.9 466.1 261 
    
  2. Dataframe 2

Этот dataframe содержит временные метки, которые произошли в конкретном событии.

Timestamp 
0 2404030 
1 2404050 
2 2404250 
3 2404266 
4 2404282 
5 2404298 
6 2404314 
7 2404330 
8 2404350 
9 2404382 

Все временные метки находятся в миллисекундах. Как вы можете видеть, первая датафрейма пересчитывается на 100 миллисекунд. Поэтому я хочу, чтобы выровнять два фрейма данных на основе count. Это означает, что на основе подсчета количества событий происходит определенное время в течение 100 мс. Например, из кадра данных 1, в течение первого 100-миллисекундного времени бина (24043950-2404049), только одно событие происходит по второму кадру данных, который составляет 2404030 и так далее. Выровненная таблица должна выглядеть так:

Timestamp L_x L_y L_a  R_x  R_y  R_a count 
    2403950 621.3 461.3 313  623.3 461.8 260 1 
    2404050 622.5 461.3 312  623.3 462.6 260 1 
    2404150 623.1 461.5 311  623.4 464  261 0 
    2404250 623.6 461.7 310  623.7 465.4 261 6 
    2404350 623.8 461.5 309  623.9 466.1 261 2 

Благодарим за помощь и предложение.

ответ

2

Вы хотите выполнить целочисленное деление на метку времени (т. Е. a // b), но сначала нужно добавить 50 к ней с учетом вашего bucketing. Затем преобразуйте его обратно в правильные единицы умножением на 100 и вычитая 50.

Теперь составьте новый индекс и выполните счет.

Затем вы объединяете эти отсчеты с исходным фреймворком данных и выполняете некоторые операции форматирования для получения данных в желаемой форме. Обязательно заполните NaNs нулем.

df2['idx'] = (df2.Timestamp + 50) // 100 * 100 - 50 

counts = df2.groupby('idx').count() 

>>> counts 
     Timestamp 
idx    
2403950   1 
2404050   1 
2404250   6 
2404350   2 

df_new =df.merge(counts, how='left', left_on='Timestamp', right_index=True, suffixes=['', '_']) 
columns = list(df_new) 
columns[-1] = 'count' 
df_new.columns = columns 
df_new['count'].fillna(0, inplace=True) 

>>> df_new 
    Timestamp L_x L_y L_a R_x R_y R_a count 
0 2403950 621.3 461.3 313 623.3 461.8 260  1 
1 2404050 622.5 461.3 312 623.3 462.6 260  1 
2 2404150 623.1 461.5 311 623.4 464.0 261  0 
3 2404250 623.6 461.7 310 623.7 465.4 261  6 
4 2404350 623.8 461.5 309 623.9 466.1 261  2 
+0

Или просто 'df2.groupby ([df2.Timestamp.map (лямбда х: (х + 50) // 100 * 100 - 50)]) рассчитывать()' –

+0

@Alexander:. Д.Ф., Вы имеете в виду dataframe 1? – Same

+0

Да, я имею в виду dataframe1 – Alexander

Смежные вопросы