2016-11-23 196 views
0

我们有两个表:连接两个熊猫Dataframes

表1:事件日志

class EventLog(Base): 
    """""" 

    __tablename__ = 'event_logs' 

    id = Column(Integer, primary_key=True, autoincrement=True) 

    # Keys 
    event_id  = Column(Integer) 
    data   = Column(String) 
    signature  = Column(String) 

    # Unique constraint 
    __table_args__ = (UniqueConstraint('event_id', 'signature'),) 

表2:Machine_Event_Logs

class Machine_Event_Logs(Base): 
    """""" 

    __tablename__ = 'machine_event_logs' 

    id = Column(Integer, primary_key=True, autoincrement=True) 

    # Keys 
    machine_id  = Column(String, ForeignKey("machines.id")) 
    event_log_id = Column(String, ForeignKey("event_logs.id")) 
    event_record_id = Column(Integer) 
    time_created = Column(String) 

    # Unique constraint 
    __table_args__ = (UniqueConstraint('machine_id', 'event_log_id', 'event_record_id', 'time_created'),) 

    # Relationships 
    event_logs  = relationship("EventLog") 

EventLogsMachine_Event_Logs之间的关系是1太多。

因此,我们在EventLogs表中注册一个唯一事件日志,然后在每次遇到该事件时向Machine_Event_Logs注册数百万条目。

目标:我们试图加入这两个表来显示捕获的事件日志的整个时间线。

我们已经尝试了Panda Dataframe中merge()函数的多种组合,但它只返回一堆NaN或空。例如:

pd.merge(event_logs, machine_event_logs, how='left', left_on='id', right_on='event_log_id') 

有关如何解决此问题的任何想法?

预先感谢您的帮助。

回答

2

根据您的数据模式,你有不兼容的类型,其中idevent_logs是一个整数,event_log_idmachine_event_logs是字符串列。在Python的字符串和同等数值的产量虚假的平等:

print('0'==0) 
# False 

因此您的大熊猫左连接在右侧合并返回所有NAN因为没有匹配成功找到。考虑转换对齐类型进行适当的合并:

event_logs['id'] = event_logs['id'].astype(str) 

OR

machine_event_logs['event_log_id'] = machine_event_logs['event_log_id'].astype(int) 
+0

感谢您捡这件事。令人难以置信的是真棒。 –