加入两个Pandas Dataframes

时间:2016-11-23 20:58:09

标签: python pandas dataframe

我们有两张桌子:

表1:EventLog

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

关于如何解决这个问题的任何想法?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

根据您的数据模式,您有不兼容的类型,其中 event_logs 中的id是整数, machine_event_logs 中的event_log_id是字符串列。在Python中,字符串及其等效数值的相等性产生错误:

print('0'==0)
# False

因此,您的pandas left join merge会返回右侧的所有NAN,因为未成功找到匹配项。考虑转换为对齐类型以进行正确合并:

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

OR

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