Python Pandas Calc专栏

时间:2017-07-08 22:55:10

标签: python pandas

我有两个Pandas数据帧,我正在尝试加入左表中的右表,其中Inclination最接近右表的'MeasuredDepth'左表'Depth'?

示例左表(主表)

index     Date_Time         Depth
6659    4/25/2017 1:26       2073.02
6660    4/25/2017 1:26       2073.287
6661    4/25/2017 1:26       2073.916
6662    4/25/2017 1:26       2074.64
6663    4/25/2017 1:26       2075.335
6664    4/25/2017 1:26       2076.044

示例右表(参考表)

index   MeasuredDepth   Inclination
16      1844           1.42
17      1939           1.69
18      2034           1.43
19      2128           1.39
20      2223           1.12
21      2317           1.22
22      2412           1.1
23      2600           0.56
24      2695           1.97

示例结果表

index   DATETIME        Depth        Inclination
6659    4/25/2017 1:26      2073.02          1.43
6660    4/25/2017 1:26      2073.287         1.43
6661    4/25/2017 1:26      2073.916         1.43
...
26704   5/3/2017 23:23      2625.316         0.56
26705   5/3/2017 23:23      2626.143         0.56
26706   5/3/2017 23:24       2627.08         0.56
26707   5/3/2017 23:24      2628.056         0.56

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

您最好和最快的方法是按升序或降序对值进行排序。

leftTable = leftTable.sort_values('Depth')
rightTable = rightTable.sort_values('Merge')
#reindex the data
leftTable = leftTable.reset_index(drop=True)
rightTable = rightTable.reset_index(drop=True)

现在将索引作为参数进行合并。

Table = leftTable.join(rightTable, how = "outer")

另一种选择是采用迭代方法,这不仅耗费时间,而且还可能导致数据丢失。 如果这是左表的升序排序数据帧(为便于修改数据)。

index Date_Time Depth
6659 4/25/2017 1:26 20
6660 4/25/2017 1:26 21
6661 4/25/2017 1:26 23
6662 4/25/2017 1:26 24
6663 4/25/2017 1:26 27
6664 4/25/2017 1:26 28

如果这是Right Table的升序排序数组(数据修改为了方便)

index MeasuredDepth Inclination
16 1844 12
17 1939 20
18 2034 21
19 2128 23
20 2223 24
21 2317 27

它们的尺寸相同。如果我们使用函数来测量两个表中每行的深度值之间的差异,那么显然右表上具有深度12的行将不会附加到任何地方,因为标准集是&#34;最小距离&#34; < / p>

如果您对数据丢失感觉不错,那么您可以尝试迭代每一行并找到最佳匹配。

答案 1 :(得分:0)

让我们使用pd.merge_asof

ref_df['MeasuredDepth'] = ref_df['MeasuredDepth'].astype(float)

df_out = pd.merge_asof(main_df, ref_df, left_on='Depth',right_on='MeasuredDepth')

输出:

     index_x Date_Time     Depth  index_y  MeasuredDepth  Inclination
0  4/25/2017      1:26  2073.020       18         2034.0         1.43
1  4/25/2017      1:26  2073.287       18         2034.0         1.43
2  4/25/2017      1:26  2073.916       18         2034.0         1.43
3  4/25/2017      1:26  2074.640       18         2034.0         1.43
4  4/25/2017      1:26  2075.335       18         2034.0         1.43
5  4/25/2017      1:26  2076.044       18         2034.0         1.43

答案 2 :(得分:0)

例如,对于左表中的每个深度值,我基本上想要在右表中查找类似的深度范围,并返回该深度的最近倾斜度。

问题在于&#39;深度&#39;左表中的值&#39;是时间序列数据所以我基本上每5秒获得一行值。右表&#39; &#39; MeasuredDepth&#39;列值仅每95英尺记录一次。因此,我只想尝试从右表中获得最接近的倾斜值,该值与更随机的深度&#39;深度相匹配。左表中的值。

enter image description here