import lasio
lasio will automatically try and import pandas
import os
l = lasio.read(os.path.join("..", "tests", "examples", "6038187_v1.2.las"))
df = l.df()
type(df)
pandas.core.frame.DataFrame
View a snapshot of the dataframe with the head()
method, which takes number of lines as an argument:
df.head(10)
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()
:
df.tail(50)
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:
df.describe()
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:
df['RES'] = 1000 / df.COND
df[100:100.5]
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:
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:
df[441:446]
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:
df.index *= 0.3048
and this time let's ask just for the last 10 samples in the file, using the iloc
attribute
df.iloc[-10:]
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 |
df.loc[136.45]
CALI 48.555 DFAR NaN DNEAR NaN GAMN NaN NEUT NaN PR NaN SP NaN COND NaN RES NaN Name: 136.45, dtype: float64
df.iloc[-4]
CALI 48.555 DFAR NaN DNEAR NaN GAMN NaN NEUT NaN PR NaN SP NaN COND NaN RES NaN Name: 136.45, dtype: float64