【问题标题】:python merge panda dataframes keep datespython合并熊猫数据框保持日期
【发布时间】:2015-10-10 21:34:01
【问题描述】:

我想将两个数据框合并在一起,但根据某些逻辑添加一列。我的数据框的简化示例如下:

 DF_1:
 domain               ttl           nameserver               file_date
 fakedomain.com       86400         ns1.fakedomain.com       8/8/2008
 fakedomainz.com      86400         ns1.fakedomainz.com      8/8/2008


 DF_2:
 domain               ttl           nameserver               file_date
 fakedomain.com       86400         ns1.fakedomain.com       9/8/2008
 fakedomainz.com      86400         ns1.fakedomainz.com      9/8/2008

我想要做的是将这两个数据框合并成一个数据框,如下所示:

 DF_2:
 domain               ttl           nameserver               first seen     last seen
 fakedomain.com       86400         ns1.fakedomain.com       8/8/2008       9/8/2008
 fakedomainz.com      86400         ns1.fakedomainz.com      8/8/2008       9/8/2008

我找不到合并它们并保留日期的方法。我还想确保日期在正确的字段中。重要的是要注意我正在从文件名中提取的正则表达式创建日期。我还将随着时间的推移连续运行这个脚本,所以第一次看到的日期只会在其他事情发生变化时发生变化,例如域更改其名称服务器。

我能想到的唯一方法是将它们与重命名的日期列合并,然后循环遍历整个数据框,对日期进行适当的排序,但这似乎效率低下。

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    我不确定是哪个过程产生了这些帧,或者它是否是连续的新数据流,但如果只是评论问题的实质,您可以这样做:

    import pandas as pd
    from StringIO import StringIO
    
    s1="""
    domain               ttl           nameserver               file_date
    fakedomain.com       86400         ns1.fakedomain.com       8/8/2008
    fakedomainz.com      86400         ns1.fakedomainz.com      8/8/2008
    """
    
    s2="""
    domain               ttl           nameserver               file_date
    fakedomain.com       86400         ns1.fakedomain.com       9/8/2008
    fakedomainz.com      86400         ns1.fakedomainz.com      9/8/2008
    """
    

    那么,

    df1 = pd.DataFrame.from_csv(StringIO(s1), sep='\s+',parse_dates=['file_date']  )
    df2 = pd.DataFrame.from_csv(StringIO(s2), sep='\s+',parse_dates=['file_date']  )
    

    假设您想要 domainttlnameserver 的唯一组合,以及该组合的第一次和最后一次观察,连接帧并获取最小和最大日期。

    result = pd.concat([df1,df2]).reset_index().groupby(['domain','ttl','nameserver']).file_date.agg({'first_seen':'min','last_seen':'max'})
    

    最后:

    result
                                              first_seen last_seen
    domain          ttl   nameserver                              
    fakedomain.com  86400 ns1.fakedomain.com    8/8/2008  9/8/2008
    fakedomainz.com 86400 ns1.fakedomainz.com   8/8/2008  9/8/2008
    

    【讨论】:

    • 这非常适合我。我必须做一个小改动,把日期变成一个日期时间对象,然后一切就到位了。我唯一的问题是如果 fakedomain.com 从 ns1.fakedomain.com 切换到 ns2.fakedomain.com 又回到 ns1.fakedomain.com 会发生什么。 ns1.fakedomain.com 会显示第一个和最后一个日期吗?我想在不覆盖之前日期的情况下捕获它在两者之间移动的交易。
    • 此示例将fakedomain.comns1.fakedomain.com 的组合视为唯一的,因此不同于fakedomain.comns2.fakedomain.com。因此,如果您在这些组中的每一个中都有许多观察值,则选择的值将是 file_date 系列中的最小值和最大值。
    猜你喜欢
    • 2016-12-08
    • 2021-05-12
    • 1970-01-01
    • 2019-08-08
    • 2017-11-03
    • 2021-05-31
    • 2016-08-07
    • 2013-09-26
    相关资源
    最近更新 更多