Как преодолеть неправильное слияние при использовании Pivot_Table? - PullRequest
1 голос
/ 23 марта 2019

У меня есть два кадра данных. Я пытаюсь создать новые столбцы на основе Sensor_Type, добавить их в DF1 и назначить каждое измерение на основе датчика.

DF1:

  Weather_Legends.head():

  Sensor_ID Sensor_Street_Name  Sensor_Lat  Sensor_Long   Sensor_Type         UOM
 0  6030    Milano - via Brera  45.471192   9.187616    Wind Direction      degree
 1  5897    Milano - via Brera  45.471192   9.187616      Temperature   Celsius degree
 2  6174    Milano - via Brera  45.471192   9.187616    Relative Humidity      %
 3  6120    Milano - via Brera  45.471192   9.187616      Wind Speed         m/s
 4  2006    Milano - via Lambrate  45.490051  9.22559   Precipitation        mm

DF2:

  Mi_Meteo.head():

  Sensor_ID    Time_Instant     Measurement
0   14121   2013-11-01 01:00:00   0.8
1   14121   2013-11-01 02:00:00   0.6
2   14121   2013-11-01 03:00:00   0.4
3   14121   2013-11-01 04:00:00   0.4
4   14121   2013-11-01 05:00:00    0

И это желаемый вывод:

Sensor_Type Sensor_ID   Sensor_Street_Name             Time_Instant      Precipitation     Relative Humidity    Wind Speed  …..
     0      14121     Milano - via Ippolito Rosellini   2013-11-01 01:00:00   0.8              NaN              NaN
     1      14121     Milano - via Ippolito Rosellin    2013-11-01 02:00:00   NaN              0.6              NaN
     2      14121     Milano - via Ippolito Rosellini   2013-11-01 03:00:00   0.4               NaN             NaN
     .
     .
     .

И вместо этого вот что я получаю:

 Sensor_Type Sensor_ID  Sensor_Street_Name               Time_Instant     Precipitation
   0          14121    Milano - via Ippolito Rosellini   2013-11-01 01:00:00    0.8
   1          14121    Milano - via Ippolito Rosellini   2013-11-01 02:00:00    0.6
   2          14121    Milano - via Ippolito Rosellini   2013-11-01 03:00:00    0.4
   .
   .

Отсутствует другой тип датчика !!!

А вот код, который я использовал:

    Mi_Meteo['Measurement'] = Mi_Meteo['Measurement'].str.rstrip(' Measure').str.strip()
    Mi_Meteo['Measurement'] = pd.to_numeric(Mi_Meteo['Measurement'] ,errors='coerce' )
    Mi_Meteo['Sensor_ID'] = Mi_Meteo['Sensor_ID'].str.rstrip(' ID').str.strip()
    Mi_Meteo['Sensor_ID'] = pd.to_numeric(Mi_Meteo['Sensor_ID'] ,errors='coerce' )

    Mi_Meteo['Measurement'] = Mi_Meteo['Measurement'].astype(float)
    Mi_Meteo['Sensor_ID'] = Mi_Meteo['Sensor_ID'].astype(float)

    df4 = Mi_Meteo.merge(Weather_Legends, on='Sensor_ID', how='left')\
                  .pivot_table(index=['Sensor_ID' ,'Sensor_Street_Name' , 'Time_Instant' ], 
                               values= 'Measurement', 
                               columns='Sensor_Type')\
                  .reset_index()
    df4['Sensor_ID'] = df4['Sensor_ID'].astype(int)

Любое предложение будет высоко оценено, спасибо вам всем.

1 Ответ

2 голосов
/ 23 марта 2019

В отсутствие ваших данных я придумал некоторые случайные данные, которые отражают, как я понимаю, структуру ваших.

Приведенный ниже код работает и дает вам то, что, как вам кажется, вы ищете. Это похоже на то, что вы, похоже, сделали, поэтому я могу только догадываться, что в структуре ваших данных должны быть некоторые ошибки.

Это будет звучать очень банально, но вы убедились, что есть показания и для других датчиков (ветер и т. Д.)? Судя по выходным данным, показания имеются только для осадков.

Ваш «желаемый результат» не имеет смысла, поскольку он показывает, что один и тот же идентификатор датчика регистрирует дождь и влажность; но вы сказали, что каждый идентификатор датчика связан только с одним типом датчика!

например. может быть, «идентификатор датчика» не является первичным ключом после примененных вами формул? Посмотрите на эти понятия здесь: https://www.essentialsql.com/what-is-the-difference-between-a-primary-key-and-a-foreign-key/ или в одном из триллионов ресурсов, доступных онлайн. Проверьте структуру ваших данных.

Не хочу звучать как битая запись, но опять же: первичные и внешние ключи! Вы действительно действительно должны понимать структуру ваших данных.

Если, пройдя через эти концепции и просмотрев ваши данные, вы все еще не видите, что с ними не так, вы можете попробовать загрузить данные в Dropbox или что-то подобное, разместив ссылку здесь и надеясь, что некоторым из нас хватит время пройти через это.

import numpy as np
import pandas as pd
import random

num_sensors=int(100)
sensors= pd.DataFrame()
sensors['sensor id']=np.arange(0,num_sensors)
sensors['address id'] =np.arange(1000,1000+num_sensors)
#;ambda function not efficient on large datasets but irrelevant here
sensors['type']= sensors.apply( lambda x: "".join( [random.choice(['rain','temp','wind']) ] ), axis=1 )

num_measurements = 10
meas = pd.DataFrame()
meas['sensor id']= np.repeat(sensors['sensor id'], num_measurements )
meas['time'] = np.tile( np.arange(0,num_measurements ), num_sensors )
meas['value'] =np.random.rand(num_measurements * num_sensors )
#otherwise the index is copied from the other dataframe, so is not unique
meas=meas.reset_index(drop=True)

joined = pd.merge(sensors, meas, how='outer', on='sensor id')
pt = joined.pivot_table( index= ['sensor id','address id','time'], columns=['type'], values=['value']  ).reset_index()
...