python merge panda数据帧保持日期

时间:2015-10-10 21:34:02

标签: python pandas merge

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

 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

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

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

1 个答案:

答案 0 :(得分:0)

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

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