【问题标题】:How to overcome the Wrong merging When using Pivot_Table?使用 Pivot_Table 时如何克服错误合并?
【发布时间】:2019-08-13 23:48:44
【问题描述】:

我有两个数据框,我想做的是根据 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)

任何建议都会非常感谢,谢谢大家。

【问题讨论】:

  • 如果要保留两个键,请尝试使用外连接?
  • 我已经尝试过 'outer' 是一样的
  • 您熟悉 SQL 以及主键和外键吗?从前 2 个表来看,似乎每个 sensor_id 只进行一种类型的测量。但是,您的第三张表(所需的输出)显示每个 sensor_id 实际上都需要多种类型的测量。它是哪一个?您向我们展示的内容似乎存在很大的不一致
  • @Pythonistaan​​onymous,不幸的是,我没有 SQL 经验,但基本上我想要它做的是,每当它遇到 Senor_ID 时,它都会为它分配适当的 Sensor_Type,例如,每次它看到传感器 14121,它为它分配氨传感器类型,并用 Nan 填充其他传感器类型列。
  • 你还没有回答我的问题。表的主键是什么,即每个表中哪些字段是唯一的,不重复的?查找主键和外键。它可以帮助您了解数据的结构。每个传感器 ID 是仅与一种传感器类型相关联,还是与多个传感器类型相关联?您可以上传您的一些数据供我们查看还是保密? PS 那么,米兰的污染程度如何? :)

标签: python-3.x pandas dataframe pivot-table multiple-columns


【解决方案1】:

在没有你的数据的情况下,我用一些随机数据来弥补,这些数据反映了我所理解的你的结构。

下面的代码有效,并为您提供了我相信您正在寻找的内容。它与您似乎所做的相似,所以我只能猜测您的数据结构一定有一些错误。

这听起来真的很平庸,但您是否验证过其他传感器也有读数(风等)?根据输出,似乎只有降水的读数。

您的“期望输出”没有意义,因为它表明相同的传感器 id 记录了雨水和湿度;但你说每个传感器 ID 只与一种传感器类型相关联!

例如在您应用公式之后,“传感器 ID”可能不是主键?在此处查找这些概念:https://www.essentialsql.com/what-is-the-difference-between-a-primary-key-and-a-foreign-key/ 或在线提供的万亿资源之一。检查数据的结构。

不要听起来像破唱片,但是,再次:主键和外键!你真的真的真的真的需要了解你的数据结构。

如果在查看了这些概念并查看了您的数据之后,您仍然看不出它有什么问题,您可以尝试将数据上传到保管箱或类似的东西,在此处发布链接并希望我们中的一些人有足够的是时候回顾一下了。

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()

【讨论】:

  • PS 有了这个,您可以检查您拥有的每种传感器的每种类型的读数;例如,这告诉您传感器 ID 1 有 10 个降雨读数,但有 0 个湿度读数,等等。注意我已经构建了数据,以便每个传感器只测量一件事,但您的“所需输出”显示其他内容:``joined.pivot_table(索引='sensor id', columns='type', values='value', aggfunc='count', fill_value=0)
  • 感谢所有帮助,非常感谢。
  • 不用担心。如果您让它工作并找到错误所在,请返回此处。我猜你的数据结构中有些东西你没有完全理解。
  • 可能是肯定的,事情是,我昨天让它完美地工作了,今天什么都没有......。无论如何,再次感谢你所做的一切。
  • 堆栈溢出的理念是您不应该发布所有代码和数据,而只是一个极简示例,以帮助其他人理解和复制您的问题。这也是一个很好的练习,可以帮助您进行调试。如果代码以我的方式处理数据结构,那么这意味着您的数据结构不同。我解决了许多问题,甚至没有在此处发布,因为我在为 stackoverflow 构建极简示例时意识到错误到底是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多