Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并数据帧:在左侧创建空列_Python_Pandas_Floating Point - Fatal编程技术网

Python 合并数据帧:在左侧创建空列

Python 合并数据帧:在左侧创建空列,python,pandas,floating-point,Python,Pandas,Floating Point,我有几个数据集,我正试图合并成一个。下面,我创建了虚拟的更简单更小的数据集来测试该方法,它工作得非常好 examplelog = pd.DataFrame({'Depth':[10,20,30,40,50,60,70,80], 'TVD':[10,19.9,28.8,37.7,46.6,55.5,64.4,73.3], 'T1':[11,11.3,11.5,12.,12.3,12.6,13.,13.8]

我有几个数据集,我正试图合并成一个。下面,我创建了虚拟的更简单更小的数据集来测试该方法,它工作得非常好

examplelog = pd.DataFrame({'Depth':[10,20,30,40,50,60,70,80], 
                       'TVD':[10,19.9,28.8,37.7,46.6,55.5,64.4,73.3],
                       'T1':[11,11.3,11.5,12.,12.3,12.6,13.,13.8],
                       'T2':[11.3,11.5,11.8,12.2,12.4,12.7,13.1,14.1]})

log1 = pd.DataFrame({'Depth':[30,40,50,60],'T3':[12.1,12.6,13.7,14.]})


log2 = pd.DataFrame({'Depth':[20,30,40,50,60],'T4':[12.0,12.2,12.4,13.2,14.1]})

logs=[log1,log2]

result=examplelog.copy()

for i in logs:
    result=result.merge(i,how='left', on='Depth')
print result
结果正如预期的那样:

Depth    T1    T2   TVD    T3    T4
0     10  11.0  11.3  10.0   NaN   NaN
1     20  11.3  11.5  19.9   NaN  12.0
2     30  11.5  11.8  28.8  12.1  12.2
3     40  12.0  12.2  37.7  12.3  12.4
4     50  12.3  12.4  46.6  13.5  13.2
5     60  12.6  12.7  55.5  14.2  14.1
6     70  13.0  13.1  64.4   NaN   NaN
7     80  13.8  14.1  73.3   NaN   NaN
结果令人满意,我将此方法应用于实际数据,但对于结果数据帧中的T3和T4,我只收到空列(所有值均为NaN)。我怀疑问题出在浮点数上,因为我的数据集是由不同的软件在不同的机器上创建的,虽然“深度”在所有文件中的精度都是两个十进制数,但我担心这两个文件中的精度可能都不是20.05,但其中一个可能是20.04999999999,而另一个可能是20.05000000000001。然后,合并函数将不起作用,如以下示例所示:

examplelog = pd.DataFrame({'Depth':[10,20,30,40,50,60,70,80], 
                           'TVD':[10,19.9,28.8,37.7,46.6,55.5,64.4,73.3],
                           'T1':[11,11.3,11.5,12.,12.3,12.6,13.,13.8],
                           'T2':[11.3,11.5,11.8,12.2,12.4,12.7,13.1,14.1]})

log1 = pd.DataFrame({'Depth':[30.05,40.05,50.05,60.05],'T3':[12.1,12.6,13.7,14.]})


log2 = pd.DataFrame({'Depth':[20.01,30.01,40.01,50.01,60.01],'T4':[12.0,12.2,12.4,13.2,14.1]})

logs=[log1,log2]

result=examplelog.copy()

for i in logs:
    result=result.merge(i,how='left', on='Depth')
print result

   Depth    T1    T2   TVD  T3  T4
0     10  11.0  11.3  10.0 NaN NaN
1     20  11.3  11.5  19.9 NaN NaN
2     30  11.5  11.8  28.8 NaN NaN
3     40  12.0  12.2  37.7 NaN NaN
4     50  12.3  12.4  46.6 NaN NaN
5     60  12.6  12.7  55.5 NaN NaN
6     70  13.0  13.1  64.4 NaN NaN
7     80  13.8  14.1  73.3 NaN NaN
你知道怎么解决这个问题吗?
谢谢

深度
值四舍五入到适当的精度:

for df in [examplelog, log1, log2]:
    df['Depth'] = df['Depth'].round(1)

屈服

   Depth    T1    T2   TVD    T3    T4
0     10  11.0  11.3  10.0   NaN   NaN
1     20  11.3  11.5  19.9   NaN  12.0
2     30  11.5  11.8  28.8  12.1  12.2
3     40  12.0  12.2  37.7  12.6  12.4
4     50  12.3  12.4  46.6  13.7  13.2
5     60  12.6  12.7  55.5  14.0  14.1
6     70  13.0  13.1  64.4   NaN   NaN
7     80  13.8  14.1  73.3   NaN   NaN

根据评论,四舍五入似乎不适用于实际数据的OP 数据。要调试此问题,请查找一些应合并的行:

subframes = []
for frame in [examplelog, log2]:
    mask = (frame['Depth'] < 20.051) & (frame['Depth'] >= 20.0)
    subframes.append(frame.loc[mask])

这可能会为我们提供重现问题所需的信息。

我明白了,这在示例中非常有效,但在我的数据中仍然无效:(.你知道数据还有什么问题吗?从视觉上看,我看不到任何问题或任何不同…谢谢。我在上面添加了一个关于如何调试问题的建议。谢谢!所以我得到的是:
Depth 1 non-null float64
(对于TVD)和其余数据
0 non-null float64
(这令人困惑,是否意味着我在合并过程中丢失了所有数据?)
0非空
意味着在合并之前没有选择任何数据。这意味着
20.049
20.051
之间没有
Depth
值。您可能需要更改数字以获取一些行。目标是创建一个小的可运行示例,重现您看到的问题。
frame.to dict('list'))
将(希望)为我们提供制作此类示例所需的数据。
subframes = []
for frame in [examplelog, log2]:
    mask = (frame['Depth'] < 20.051) & (frame['Depth'] >= 20.0)
    subframes.append(frame.loc[mask])
for frame in subframes:
    print(frame.to_dict('list')) 
    print(frame.info())          # shows the dtypes of the columns