In [1]:
import lasio

lasio will automatically try and import pandas


In [2]:
import os
l = lasio.read(os.path.join("..", "tests", "examples", "6038187_v1.2.las"))

If pandas is installed, you can use the df() method to get a pandas DataFrame version of the data section:


In [3]:
df = l.df()

In [4]:
type(df)


Out[4]:
pandas.core.frame.DataFrame

View a snapshot of the dataframe with the head() method, which takes number of lines as an argument:


In [5]:
df.head(10)


Out[5]:
CALI DFAR DNEAR GAMN NEUT PR SP COND
DEPT
0.05 49.765 4.587 3.382 NaN NaN NaN NaN NaN
0.10 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.15 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.20 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.25 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.30 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.35 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.40 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.45 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998
0.50 49.765 4.587 3.382 -2324.28 NaN 115.508 -3.049 -116.998

Or look at the data at the bottom of the hole with the similar method tail():


In [6]:
df.tail(50)


Out[6]:
CALI DFAR DNEAR GAMN NEUT PR SP COND
DEPT
134.15 101.408 1.628 1.404 -2324.28 128.000 115.508 -3.049 581.113
134.20 101.402 1.576 1.411 -2324.28 158.000 115.508 -3.049 580.619
134.25 101.336 1.609 1.405 -2324.28 131.000 115.508 -3.049 584.571
134.30 101.330 1.596 1.418 -2324.28 149.994 115.508 -3.049 594.695
134.35 101.336 1.630 1.417 -2324.28 139.003 115.508 -3.049 601.612
134.40 101.330 1.616 1.418 -2324.28 160.000 115.508 -3.049 607.295
134.45 101.313 1.615 1.444 -2324.28 129.000 115.508 -3.049 608.777
134.50 101.301 1.577 1.383 -2324.28 171.000 115.508 -3.049 603.343
134.55 101.289 1.600 1.368 -2324.28 138.010 115.508 -3.049 594.948
134.60 101.037 1.555 1.395 -2324.28 165.991 115.508 -3.049 584.327
134.65 100.983 1.563 1.357 -2324.28 158.000 115.508 -3.049 578.643
134.70 100.833 1.570 1.357 NaN NaN NaN NaN 571.233
134.75 93.760 1.582 1.378 NaN NaN NaN NaN 565.552
134.80 88.086 1.561 1.361 NaN NaN NaN NaN 570.490
134.85 86.443 1.516 1.338 NaN NaN NaN NaN 574.937
134.90 79.617 5.989 1.356 NaN NaN NaN NaN 579.137
134.95 65.236 4.587 1.397 NaN NaN NaN NaN NaN
135.00 55.833 4.587 1.351 NaN NaN NaN NaN NaN
135.05 49.061 4.587 1.329 NaN NaN NaN NaN NaN
135.10 49.036 NaN NaN NaN NaN NaN NaN NaN
135.15 49.024 NaN NaN NaN NaN NaN NaN NaN
135.20 49.005 NaN NaN NaN NaN NaN NaN NaN
135.25 48.999 NaN NaN NaN NaN NaN NaN NaN
135.30 48.987 NaN NaN NaN NaN NaN NaN NaN
135.35 48.980 NaN NaN NaN NaN NaN NaN NaN
135.40 48.962 NaN NaN NaN NaN NaN NaN NaN
135.45 48.962 NaN NaN NaN NaN NaN NaN NaN
135.50 48.925 NaN NaN NaN NaN NaN NaN NaN
135.55 48.931 NaN NaN NaN NaN NaN NaN NaN
135.60 48.919 NaN NaN NaN NaN NaN NaN NaN
135.65 48.900 NaN NaN NaN NaN NaN NaN NaN
135.70 48.882 NaN NaN NaN NaN NaN NaN NaN
135.75 48.863 NaN NaN NaN NaN NaN NaN NaN
135.80 48.857 NaN NaN NaN NaN NaN NaN NaN
135.85 48.839 NaN NaN NaN NaN NaN NaN NaN
135.90 48.808 NaN NaN NaN NaN NaN NaN NaN
135.95 48.802 NaN NaN NaN NaN NaN NaN NaN
136.00 48.789 NaN NaN NaN NaN NaN NaN NaN
136.05 48.771 NaN NaN NaN NaN NaN NaN NaN
136.10 48.765 NaN NaN NaN NaN NaN NaN NaN
136.15 48.752 NaN NaN NaN NaN NaN NaN NaN
136.20 48.734 NaN NaN NaN NaN NaN NaN NaN
136.25 48.684 NaN NaN NaN NaN NaN NaN NaN
136.30 48.666 NaN NaN NaN NaN NaN NaN NaN
136.35 48.647 NaN NaN NaN NaN NaN NaN NaN
136.40 48.604 NaN NaN NaN NaN NaN NaN NaN
136.45 48.555 NaN NaN NaN NaN NaN NaN NaN
136.50 48.555 NaN NaN NaN NaN NaN NaN NaN
136.55 48.438 NaN NaN NaN NaN NaN NaN NaN
136.60 -56.275 NaN NaN NaN NaN NaN NaN NaN

Use the describe() method to return basic statistical information about the curves in the dataframe:


In [7]:
df.describe()


Out[7]:
CALI DFAR DNEAR GAMN NEUT PR SP COND
count 2732.000000 2701.000000 2701.000000 2691.000000 2492.000000 2692.000000 2692.000000 2697.000000
mean 97.432002 1.767922 1.729209 -102.330033 441.600013 17940.522307 90.393464 478.670791
std 13.939547 0.480333 0.372412 630.106420 370.138208 22089.297212 26.725547 753.869866
min -56.275000 0.725000 0.657001 -2324.280000 81.001800 115.508000 -3.049000 -116.998000
25% 101.077500 1.526000 1.535000 55.783000 158.002000 2652.470000 93.495500 200.981000
50% 101.426000 1.758000 1.785000 74.376900 256.501500 2709.345000 99.994000 266.435000
75% 101.582000 1.993000 1.948000 88.326900 680.500250 50499.900000 100.623000 505.530000
max 103.380000 5.989000 3.382000 169.672000 1665.990000 50499.900000 102.902000 4978.160000

Calculations are easy in a dataframe. As a simple example, let's convert conductivity to resistivity:


In [8]:
df['RES'] = 1000 / df.COND

In [9]:
df[100:100.5]


Out[9]:
CALI DFAR DNEAR GAMN NEUT PR SP COND RES
DEPT
100.00 101.546 1.955 1.876 127.8290 237.997 2655.37 92.957 318.800 3.136763
100.05 101.540 1.988 1.919 90.6593 237.000 2662.04 92.926 311.391 3.211397
100.10 101.516 1.986 1.911 83.6761 243.999 2651.62 92.926 306.697 3.260547
100.15 101.504 2.010 1.904 109.2380 237.001 2660.50 92.938 301.263 3.319359
100.20 101.474 1.993 1.897 92.9720 191.000 2657.42 92.969 297.804 3.357913
100.25 101.408 2.013 1.909 88.3237 240.992 2656.74 92.953 298.051 3.355130
100.30 101.438 2.033 1.874 125.5010 218.007 2658.62 92.957 298.792 3.346810
100.35 101.486 1.965 1.908 90.6533 244.996 2663.92 92.975 304.966 3.279054
100.40 101.528 2.039 1.938 95.2953 207.006 2666.49 92.984 311.141 3.213977
100.45 101.564 2.021 1.947 74.3780 189.000 2665.46 93.005 318.305 3.141641
100.50 101.600 2.027 1.948 72.0534 199.998 2664.09 93.011 328.430 3.044789

Convert the depth index to feet:


In [10]:
df.index = df.index / 0.3048

Note that now the units of the indices used on the DataFrame are in feet, and it uses the nearest existing value:


In [11]:
df[441:446]


Out[11]:
CALI DFAR DNEAR GAMN NEUT PR SP COND RES
DEPT
441.108924 101.313 1.615 1.444 -2324.28 129.000 115.508 -3.049 608.777 1.642638
441.272966 101.301 1.577 1.383 -2324.28 171.000 115.508 -3.049 603.343 1.657432
441.437008 101.289 1.600 1.368 -2324.28 138.010 115.508 -3.049 594.948 1.680819
441.601050 101.037 1.555 1.395 -2324.28 165.991 115.508 -3.049 584.327 1.711371
441.765092 100.983 1.563 1.357 -2324.28 158.000 115.508 -3.049 578.643 1.728181
441.929134 100.833 1.570 1.357 NaN NaN NaN NaN 571.233 1.750599
442.093176 93.760 1.582 1.378 NaN NaN NaN NaN 565.552 1.768184
442.257218 88.086 1.561 1.361 NaN NaN NaN NaN 570.490 1.752879
442.421260 86.443 1.516 1.338 NaN NaN NaN NaN 574.937 1.739321
442.585302 79.617 5.989 1.356 NaN NaN NaN NaN 579.137 1.726707
442.749344 65.236 4.587 1.397 NaN NaN NaN NaN NaN NaN
442.913386 55.833 4.587 1.351 NaN NaN NaN NaN NaN NaN
443.077428 49.061 4.587 1.329 NaN NaN NaN NaN NaN NaN
443.241470 49.036 NaN NaN NaN NaN NaN NaN NaN NaN
443.405512 49.024 NaN NaN NaN NaN NaN NaN NaN NaN
443.569554 49.005 NaN NaN NaN NaN NaN NaN NaN NaN
443.733596 48.999 NaN NaN NaN NaN NaN NaN NaN NaN
443.897638 48.987 NaN NaN NaN NaN NaN NaN NaN NaN
444.061680 48.980 NaN NaN NaN NaN NaN NaN NaN NaN
444.225722 48.962 NaN NaN NaN NaN NaN NaN NaN NaN
444.389764 48.962 NaN NaN NaN NaN NaN NaN NaN NaN
444.553806 48.925 NaN NaN NaN NaN NaN NaN NaN NaN
444.717848 48.931 NaN NaN NaN NaN NaN NaN NaN NaN
444.881890 48.919 NaN NaN NaN NaN NaN NaN NaN NaN
445.045932 48.900 NaN NaN NaN NaN NaN NaN NaN NaN
445.209974 48.882 NaN NaN NaN NaN NaN NaN NaN NaN
445.374016 48.863 NaN NaN NaN NaN NaN NaN NaN NaN
445.538058 48.857 NaN NaN NaN NaN NaN NaN NaN NaN
445.702100 48.839 NaN NaN NaN NaN NaN NaN NaN NaN
445.866142 48.808 NaN NaN NaN NaN NaN NaN NaN NaN

convert back to metres:


In [12]:
df.index *= 0.3048

and this time let's ask just for the last 10 samples in the file, using the iloc attribute


In [13]:
df.iloc[-10:]


Out[13]:
CALI DFAR DNEAR GAMN NEUT PR SP COND RES
DEPT
136.15 48.752 NaN NaN NaN NaN NaN NaN NaN NaN
136.20 48.734 NaN NaN NaN NaN NaN NaN NaN NaN
136.25 48.684 NaN NaN NaN NaN NaN NaN NaN NaN
136.30 48.666 NaN NaN NaN NaN NaN NaN NaN NaN
136.35 48.647 NaN NaN NaN NaN NaN NaN NaN NaN
136.40 48.604 NaN NaN NaN NaN NaN NaN NaN NaN
136.45 48.555 NaN NaN NaN NaN NaN NaN NaN NaN
136.50 48.555 NaN NaN NaN NaN NaN NaN NaN NaN
136.55 48.438 NaN NaN NaN NaN NaN NaN NaN NaN
136.60 -56.275 NaN NaN NaN NaN NaN NaN NaN NaN

In [18]:
df.loc[136.45]


Out[18]:
CALI     48.555
DFAR        NaN
DNEAR       NaN
GAMN        NaN
NEUT        NaN
PR          NaN
SP          NaN
COND        NaN
RES         NaN
Name: 136.45, dtype: float64

In [19]:
df.iloc[-4]


Out[19]:
CALI     48.555
DFAR        NaN
DNEAR       NaN
GAMN        NaN
NEUT        NaN
PR          NaN
SP          NaN
COND        NaN
RES         NaN
Name: 136.45, dtype: float64

In [ ]: