给定两个dataframes df_1和df_2如何加入他们的行列,使得datetime列df_1是介于两者之间start,并end 在数据帧df_2:
print df_1
timestamp A B
0 2016-05-14 10:54:33 0.020228 0.026572
1 2016-05-14 10:54:34 0.057780 0.175499
2 2016-05-14 10:54:35 0.098808 0.620986
3 2016-05-14 10:54:36 0.158789 1.014819
4 2016-05-14 10:54:39 0.038129 2.384590
print df_2
start end event
0 2016-05-14 10:54:31 2016-05-14 10:54:33 E1
1 2016-05-14 10:54:34 2016-05-14 10:54:37 E2
2 2016-05-14 10:54:38 2016-05-14 10:54:42 E3
Run Code Online (Sandbox Code Playgroud)
获取相应的event位置和df1.timestamp之间df_2.startdf2.end
timestamp A B event
0 2016-05-14 10:54:33 …Run Code Online (Sandbox Code Playgroud) 我经常使用范围条件将pandas用于合并(join).
例如,如果有2个数据帧:
A(A_id,A_value)
B(B_id,B_low,B_high,B_name)
它们很大并且大小相同(比如每个2M记录).
我想在A和B之间建立一个内连接,所以A_value将在B_low和B_high之间.
使用SQL语法:
SELECT *
FROM A,B
WHERE A_value between B_low and B_high
Run Code Online (Sandbox Code Playgroud)
这将非常简单,简短而有效.
同时在pandas中唯一的方法(不使用我发现的循环)是在两个表中创建一个虚拟列,连接它(相当于交叉连接),然后过滤掉不需要的行.这听起来沉重而复杂:
A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
Run Code Online (Sandbox Code Playgroud)
我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.
是否有更优雅和/或更有效的方式来执行此操作?
我有两个数据帧,我需要根据日期值是否适合两个其他日期进行合并.基本上我需要执行外连接,其中B.event_date位于A.start_date和A.end_date之间.似乎合并和连接总是假设一个公共列,在这种情况下,我没有.
A B
start_date end_date event_date price
0 2017-03-27 2017-04-20 0 2017-01-20 100
1 2017-01-10 2017-02-01 1 2017-01-27 200
Result
start_date end_date event_date price
0 2017-03-27 2017-04-20
1 2017-01-10 2017-02-01 2017-01-20 100
2 2017-01-10 2017-02-01 2017-01-27 200
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的pandas查找表
Grade Lower_Boundary Upper_Boundary
1 -110 -96
2 -96 -91
3 -91 -85
4 -85 -81
5 -81 -77
6 -77 -72
7 -72 -68
8 -68 -63
9 -63 -58
10 -58 -54
11 -54 -50
12 -50 -46
13 -46 -42
14 -42 -38
15 -38 -34
16 -34 -28
17 -28 -18
18 -18 -11
19 -11 -11
20 -11 -9
Run Code Online (Sandbox Code Playgroud)
我有另一个看起来包含得分的熊猫数据框.我想通过查找查找表将"成绩"分配给分数列.因此,根据分数下降和上限的间隔,应从查找表中的该行分配等级.有没有办法在不输入if if else语句的情况下执行此操作?我只想到excel的索引匹配.
Score Grade
-75 6
-75 6
-60 9
-66 8
-66 8
-98 …Run Code Online (Sandbox Code Playgroud) 我有两个大熊猫dataframes:一个(df1)有三列(StartDate,EndDate,和ID)和第二(df2)用日期.我想合并df1并df2基于df1.StartDate和之间的df2.Date df2.EndDate.
每个日期范围df1都是唯一的,不会与数据框中的任何其他行重叠.
日期格式化YYYY-MM-DD.
我有一个数据框,每 10 分钟有一个日期时间列和一个数值:
df1 = pd.DataFrame({'time' : pd.date_range('1/1/2018', periods=20, freq='10min'), 'value' : np.random.randint(2, 20, size=20)})
Run Code Online (Sandbox Code Playgroud)
另一个有事件时间表,有开始时间和结束时间。可以同时发生多个事件:
df2 = pd.DataFrame({'start_time' : ['2018-01-01 00:00:00', '2018-01-01 00:00:00','2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 02:00:00' ], 'end_time' : ['2018-01-01 01:00:00', '2018-01-01 01:00:00', '2018-01-01 02:00:00','2018-01-01 02:00:00', '2018-01-01 02:00:00', '2018-01-01 03:00:00'], 'event' : ['A', 'B', 'C', 'D', 'E', 'F'] })
df2[['start_time', 'end_time']] = df2.iloc[:,0:2].apply(pd.to_datetime)
Run Code Online (Sandbox Code Playgroud)
我想对 df1 进行左连接,所有事件都在开始和结束时间内。我的输出表应该是:
time value event
0 2018-01-01 00:00:00 5 A
1 2018-01-01 00:00:00 5 B
2 2018-01-01 00:10:00 15 A
3 …Run Code Online (Sandbox Code Playgroud)