我试图在名称和最近的日期合并两个数据帧(WRT左手数据帧).在我的研究中,我在这里找到了一个类似的问题,但它也没有考虑到这个名字.从上面的问题看来似乎没有办法用merge做这个,但我看不到另一种方法来做两个不使用pandas merge函数的参数连接.
有合并的方法吗?如果不是这样做的合适方式是什么?
我会发布一份我尝试过的内容,但这是在日期上进行精确合并而无法正常进行的.最重要的一行是我制作data3数据帧的最后一行.
data=pd.read_csv("edgar14Afacts.csv", parse_dates={"dater": [2]}, infer_datetime_format=True)
data2=pd.read_csv("sdcmergersdata.csv", parse_dates={"dater": [17]}, infer_datetime_format=True)
list(data2.columns.values)
data2.rename(columns=lambda x: x.replace('\r\n', ''), inplace=True)
data2.rename(columns=lambda x: x.replace('\n', ''), inplace=True)
data2.rename(columns=lambda x: x.replace('\r', ''), inplace=True)
data2=data2.rename(columns = {'Acquiror Name':'name'})
data2=data2.rename(columns = {'dater':'date'})
data=data.rename(columns = {'dater':'date'})
list(data2.columns.values)
data["name"]=data['name'].map(str.lower)
data2["name"]=data2['name'].map(str.lower)
data2['date'].fillna(method='pad')
data['namer1']=data['name']
data['dater1']=data['date']
data2['namer2']=data2['name']
data2['dater2']=data2['date']
print data.head()
print data2.head()
data['name'] = data['name'].map(lambda x: str(x)[:4])
data2['name'] = data2['name'].map(lambda x: str(x)[:4])
data3 = pd.merge(data, data2, how='left', on=['date','name'])
data3.to_csv("check.csv")
Run Code Online (Sandbox Code Playgroud) 有哪些方法可用于合并时间戳不完全匹配的列?
DF1:
date start_time employee_id session_id
01/01/2016 01/01/2016 06:03:13 7261824 871631182
Run Code Online (Sandbox Code Playgroud)
DF2:
date start_time employee_id session_id
01/01/2016 01/01/2016 06:03:37 7261824 871631182
Run Code Online (Sandbox Code Playgroud)
我可以加入['date','employee_id','session_id'],但有时同一个员工在同一天会有多个相同的会话,这会导致重复.我可以删除发生这种情况的行,但如果我这样做,我将失去有效的会话.
如果DF1的时间戳距离DF2的时间戳<5分钟,并且session_id和employee_id也匹配,是否有一种有效的加入方式?如果存在匹配记录,则时间戳将始终稍晚于DF1,因为事件在将来某个时间点触发.
['employee_id', 'session_id', 'timestamp<5minutes']
Run Code Online (Sandbox Code Playgroud)
编辑 - 我以为有人会遇到这个问题.
我在想这样做:
创建一个10分钟的间隔字符串以加入文件
Run Code Online (Sandbox Code Playgroud)df1['low_time'] = df1['start_time'] - timedelta(minutes=5) df1['high_time'] = df1['start_time'] + timedelta(minutes=5) df1['interval_string'] = df1['low_time'].astype(str) + df1['high_time'].astype(str)
有人知道如何将这5分钟的间隔绕到最近的5分钟标记处吗?
02:59:37 - 5分钟= 02:55:00
02:59:37 + 5分钟= 03:05:00
interval_string = '02:55:00-03:05:00'
pd.merge(df1, df2, how = 'left', on = ['employee_id', 'session_id', 'date', 'interval_string']
Run Code Online (Sandbox Code Playgroud)
有谁知道如何围绕这样的时间?这似乎可行.您仍然根据日期,员工和会话进行匹配,然后查找基本上在相同的10分钟间隔或范围内的时间
我有两个数据帧,如下所示:
A = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["06/22/2014","07/02/2014","01/01/2015","01/01/1991","08/02/1999"]})
B = pd.DataFrame({"ID":["A", "A", "C" ,"B", "B"], "date":["02/15/2015","06/30/2014","07/02/1999","10/05/1990","06/24/2014"], "value": ["3","5","1","7","8"] })
Run Code Online (Sandbox Code Playgroud)
如下图所示:
>>> A
ID date
0 A 2014-06-22
1 A 2014-07-02
2 C 2015-01-01
3 B 1991-01-01
4 B 1999-08-02
>>> B
ID date value
0 A 2015-02-15 3
1 A 2014-06-30 5
2 C 1999-07-02 1
3 B 1990-10-05 7
4 B 2014-06-24 8
Run Code Online (Sandbox Code Playgroud)
我想使用最近的日期将A与B的值合并。在此示例中,没有日期匹配,但某些日期可能匹配。
输出应该是这样的:
>>> C
ID date value
0 A 06/22/2014 8
1 A 07/02/2014 5 …Run Code Online (Sandbox Code Playgroud) 我想基于两列合并两个数据框:"代码"和"日期".可以直接根据"代码"合并数据帧,但是在"日期"的情况下变得棘手 - 在df1和df2中的日期之间没有完全匹配.所以,我想选择最接近的日期.我怎样才能做到这一点?
df = df1[column_names1].merge(df2[column_names2], on='Code')
Run Code Online (Sandbox Code Playgroud)