Data Cleaning#

import pandas as pd
import geolime as geo

# Format Pandas display for clarity and readability
pd.set_option("display.max_rows", 10)
pd.set_option("display.max_columns", 500)

Hyperspectral Assay data cleaning

Import Data#

First, we need to import our data from a .csv file.

hs_assay = geo.datasets.load("rocklea_dome/RC_data_tsgexport.csv")
hs_assay
Sample Sample Name Borehole ID Depth from Easting Northing Fe % Al2O3 SiO2 % K2O % CaO % MgO % TiO2 % P % S % Mn % LOI Fe ox ai hem/goe kaolin abundance kaolin composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
0 10001-10059_0001_1 T=1 L=1 P=1 D=0.500000 H=10001-10059 Rkc278 0.0 548001.3 7474002.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1290 891.13 0.0374 0.999 NaN NaN NaN NaN
1 10001-10059_0001_2 T=1 L=1 P=2 D=1.500000 H=10001-10059 Rkc278 1.0 548001.3 7474002.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1460 892.68 0.0269 1.006 NaN NaN NaN NaN
2 10001-10059_0001_3 T=1 L=1 P=3 D=2.500000 H=10001-10059 Rkc278 2.0 548001.3 7474002.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1650 895.24 NaN NaN NaN NaN NaN NaN
3 10001-10059_0001_4 T=1 L=1 P=4 D=3.500000 H=10001-10059 Rkc278 3.0 548001.3 7474002.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1000 893.34 NaN NaN 0.0545 2211.83 NaN NaN
4 10001-10059_0001_5 T=1 L=1 P=5 D=4.500000 H=10001-10059 Rkc278 4.0 548001.3 7474002.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0445 910.32 NaN NaN NaN NaN 0.111 2312.89
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7515 17202-17248_0128_56 T=128 L=376 P=16 D=55.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7516 17202-17248_0128_57 T=128 L=376 P=17 D=56.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7517 17202-17248_0128_58 T=128 L=376 P=18 D=57.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7518 17202-17248_0128_59 T=128 L=376 P=19 D=58.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7519 17202-17248_0128_60 T=128 L=376 P=20 D=59.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

7520 rows × 25 columns

hs_assay.sort_values(by="Borehole ID", inplace=True)

Check for invalid composites: no hole identifier or no depth from information#

hs_assay[hs_assay["Borehole ID"].isna()]
Sample Sample Name Borehole ID Depth from Easting Northing Fe % Al2O3 SiO2 % K2O % CaO % MgO % TiO2 % P % S % Mn % LOI Fe ox ai hem/goe kaolin abundance kaolin composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
47 10001-10059_0001_48 T=1 L=3 P=8 D=47.500000 H=10001-10059 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
144 10121-10180_0003_25 T=3 L=8 P=5 D=24.500000 H=10121-10180 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
182 10181-10239_0004_3 T=4 L=10 P=3 D=2.500000 H=10181-10239 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.148 908.1 0.208 1.087 NaN NaN NaN NaN
190 10181-10239_0004_11 T=4 L=10 P=11 D=10.500000 H=10181-10239 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
246 10240-10298_0005_7 T=5 L=13 P=7 D=6.500000 H=10240-10298 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7515 17202-17248_0128_56 T=128 L=376 P=16 D=55.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7516 17202-17248_0128_57 T=128 L=376 P=17 D=56.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7517 17202-17248_0128_58 T=128 L=376 P=18 D=57.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7518 17202-17248_0128_59 T=128 L=376 P=19 D=58.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7519 17202-17248_0128_60 T=128 L=376 P=20 D=59.500000 H=17202-17248 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

378 rows × 25 columns

378 composites do not have any hole identifiant Borehole ID, they cannot be used.

hs_assay.dropna(subset=["Borehole ID"], inplace=True)
hs_assay[hs_assay["Depth from"].isna()] 
Sample Sample Name Borehole ID Depth from Easting Northing Fe % Al2O3 SiO2 % K2O % CaO % MgO % TiO2 % P % S % Mn % LOI Fe ox ai hem/goe kaolin abundance kaolin composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
525 10480-10539_0009_46 T=9 L=27 P=6 D=45.500000 H=10480-10539 Rkc289 NaN 548198.7 7475193.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2837 12755-12809_0050_58 T=50 L=142 P=18 D=57.500000 H=12755-12809 Rkc359 NaN 547795.0 7477207.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0470 918.22 NaN NaN 0.0307 2219.17 NaN NaN
2838 12755-12809_0050_59 T=50 L=142 P=19 D=58.500000 H=12755-12809 Rkc359 NaN 547795.0 7477207.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0664 920.82 NaN NaN 0.0460 2219.26 NaN NaN
2840 12810-12869_0051_1 T=51 L=143 P=1 D=0.500000 H=12810-12869 Rkc359 NaN 547795.0 7477207.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1300 919.12 0.203 0.982 NaN NaN NaN NaN
2839 12755-12809_0050_60 T=50 L=142 P=20 D=59.500000 H=12755-12809 Rkc359 NaN 547795.0 7477207.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1070 920.63 NaN NaN 0.0405 2218.72 NaN NaN
7037 16791-16832_0120_58 T=120 L=352 P=18 D=57.500000 H=16791-16832 Rkc478 NaN 548153.6 7475996.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0795 902.29 0.217 1.091 NaN NaN NaN NaN
7039 16791-16832_0120_60 T=120 L=352 P=20 D=59.500000 H=16791-16832 Rkc478 NaN 548153.6 7475996.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1480 891.38 0.213 1.090 NaN NaN NaN NaN
7038 16791-16832_0120_59 T=120 L=352 P=19 D=58.500000 H=16791-16832 Rkc478 NaN 548153.6 7475996.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1400 889.42 0.144 1.055 NaN NaN NaN NaN

8 composites do not have a given Depth From, making them unusable. It seems the Sample Name column contains some depth information, but there is no information about this column, we prefer to discard any sample with doubts.

hs_assay.dropna(subset=["Depth from"], inplace=True)

Check for duplicate composites#

hs_assay[hs_assay.duplicated(subset=["Borehole ID", "Depth from"],keep=False)]
Sample Sample Name Borehole ID Depth from Easting Northing Fe % Al2O3 SiO2 % K2O % CaO % MgO % TiO2 % P % S % Mn % LOI Fe ox ai hem/goe kaolin abundance kaolin composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
656 10600-10659_0011_57 T=11 L=33 P=17 D=56.500000 H=10600-10659 Rkc292 29.0 547895.7 7475196.5 47.0 8.97 10.15 0.068 0.12 0.37 0.685 0.033 0.009 0.41 12.04 0.2320 917.02 0.0378 0.991 NaN NaN NaN NaN
655 10600-10659_0011_56 T=11 L=33 P=16 D=55.500000 H=10600-10659 Rkc292 29.0 547895.7 7475196.5 47.0 7.66 12.10 0.058 0.24 0.45 0.448 0.024 0.026 0.33 11.50 0.2430 908.84 NaN NaN NaN NaN NaN NaN
5076 14992-15051_0088_17 T=88 L=254 P=17 D=16.500000 H=14992-15051 Rkc427 45.0 548048.5 7475600.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1240 911.21 0.1090 1.032 NaN NaN NaN NaN
5075 14992-15051_0088_16 T=88 L=254 P=16 D=15.500000 H=14992-15051 Rkc427 45.0 548048.5 7475600.0 22.0 20.55 34.00 0.235 0.10 0.32 1.367 0.015 0.004 0.13 11.10 0.1960 912.05 0.1200 1.027 NaN NaN NaN NaN
5273 15169-15225_0091_34 T=91 L=264 P=14 D=33.500000 H=15169-15225 Rkc431 43.0 547648.3 7475604.5 5.0 28.44 51.15 0.025 0.16 0.40 0.660 0.006 0.001 NaN 10.64 0.0821 920.68 0.2910 1.117 NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
6897 16690-16739_0118_38 T=118 L=345 P=18 D=37.500000 H=16690-16739 Rkc475 17.0 547649.4 7475801.5 52.0 5.48 8.18 0.019 0.12 0.36 0.148 0.031 0.016 0.07 11.70 0.2960 908.30 NaN NaN 0.0303 2206.11 NaN NaN
6898 16690-16739_0118_39 T=118 L=345 P=19 D=38.500000 H=16690-16739 Rkc475 17.0 547649.4 7475801.5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.2780 908.06 NaN NaN 0.0296 2205.96 NaN NaN
5047 14932-14991_0087_48 T=87 L=253 P=8 D=47.500000 H=14932-14991 Rkd015 0.0 547993.0 7473995.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6254 16077-16135_0107_55 T=107 L=313 P=15 D=54.500000 H=16077-16135 Rkd015 0.0 547993.0 7473995.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6255 16077-16135_0107_56 T=107 L=313 P=16 D=55.500000 H=16077-16135 Rkd015 0.0 547993.0 7473995.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

51 rows × 25 columns

51 composites appear to be defined at the same depth, we will remove the column with the most number of NaN values.

Discard based on other criterion

Other rules could be implemented, for example regarding the value in Iron and remove the possible outlier.

We first compute the number of NaN values per row:

hs_assay["number_of_NaNs"] = hs_assay[hs_assay.columns].isna().sum(1)

Then we sort the DataFrame by Borehole ID, Depth from and number of NaN, and first row is kept.

hs_assay.sort_values(by=["Borehole ID", "Depth from", "number_of_NaNs"], ascending=[True, True, False], inplace=True)
hs_assay.drop_duplicates(subset=["Borehole ID", "Depth from"], keep="first", inplace=True)

Remove unneeded columns#

We can delete the first two columns and rename the third one into Hole_ID in order to matchv the other files nomenclature. We will need identical names to be able to make comparisons between the files. We also delete location information as they are given in the collar file. The created column used for filtering duplicates is also removed.

hs_assay = hs_assay.drop(columns=["Sample", "Sample Name", "Easting", "Northing", "number_of_NaNs"])

Spaces and special characters are not recommended as they can be source of error and conflicts depending on the operating systems. The ambiguity of special characters in programmation can also be a source of errors. User can specify property unit in GeoLime, see it section 2 - Drillholes creation and quick visualization

hs_assay.columns = hs_assay.columns.str.replace(" ", "_")
hs_assay.columns = hs_assay.columns.str.replace("_%", "_pct")
hs_assay.columns = hs_assay.columns.str.replace("/", "_over_")
hs_assay.rename(columns={"Borehole_ID": "Hole_ID", "Depth_from": "From"}, inplace=True)
hs_assay
Hole_ID From Fe_pct Al2O3 SiO2_pct K2O_pct CaO_pct MgO_pct TiO2_pct P_pct S_pct Mn_pct LOI Fe_ox_ai hem_over_goe kaolin_abundance kaolin_composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
0 Rkc278 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1290 891.13 0.0374 0.999 NaN NaN NaN NaN
1 Rkc278 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1460 892.68 0.0269 1.006 NaN NaN NaN NaN
2 Rkc278 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1650 895.24 NaN NaN NaN NaN NaN NaN
3 Rkc278 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1000 893.34 NaN NaN 0.0545 2211.83 NaN NaN
4 Rkc278 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0445 910.32 NaN NaN NaN NaN 0.111 2312.89
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7501 Rkc485 41.0 28.0 9.80 39.05 0.037 0.08 0.22 1.078 0.027 0.006 0.12 9.00 0.2210 912.17 0.0322 1.004 NaN NaN NaN NaN
7502 Rkc485 42.0 39.0 7.67 25.15 0.029 0.09 0.25 0.689 0.046 0.008 0.11 10.11 0.1200 912.43 0.1140 1.027 NaN NaN NaN NaN
7503 Rkc485 43.0 16.0 20.23 43.41 0.177 0.17 0.34 1.617 0.020 0.018 0.05 10.80 0.0956 888.81 0.0306 1.012 NaN NaN NaN NaN
7504 Rkc485 44.0 12.0 12.53 50.24 0.060 0.26 0.25 1.473 0.006 0.779 0.03 16.18 0.0378 958.21 0.1100 1.025 NaN NaN NaN NaN
5047 Rkd015 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

7108 rows × 21 columns

The following modification is very situational, but in our case the Hole_IDs are lowercase, while in the Collar and Survey files this is not the case, and since the names must match between the files, we will apply this function to the Hole_ID column:

hs_assay["Hole_ID"] = hs_assay["Hole_ID"].apply(str.upper)
hs_assay
Hole_ID From Fe_pct Al2O3 SiO2_pct K2O_pct CaO_pct MgO_pct TiO2_pct P_pct S_pct Mn_pct LOI Fe_ox_ai hem_over_goe kaolin_abundance kaolin_composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
0 RKC278 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1290 891.13 0.0374 0.999 NaN NaN NaN NaN
1 RKC278 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1460 892.68 0.0269 1.006 NaN NaN NaN NaN
2 RKC278 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1650 895.24 NaN NaN NaN NaN NaN NaN
3 RKC278 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1000 893.34 NaN NaN 0.0545 2211.83 NaN NaN
4 RKC278 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0445 910.32 NaN NaN NaN NaN 0.111 2312.89
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7501 RKC485 41.0 28.0 9.80 39.05 0.037 0.08 0.22 1.078 0.027 0.006 0.12 9.00 0.2210 912.17 0.0322 1.004 NaN NaN NaN NaN
7502 RKC485 42.0 39.0 7.67 25.15 0.029 0.09 0.25 0.689 0.046 0.008 0.11 10.11 0.1200 912.43 0.1140 1.027 NaN NaN NaN NaN
7503 RKC485 43.0 16.0 20.23 43.41 0.177 0.17 0.34 1.617 0.020 0.018 0.05 10.80 0.0956 888.81 0.0306 1.012 NaN NaN NaN NaN
7504 RKC485 44.0 12.0 12.53 50.24 0.060 0.26 0.25 1.473 0.006 0.779 0.03 16.18 0.0378 958.21 0.1100 1.025 NaN NaN NaN NaN
5047 RKD015 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

7108 rows × 21 columns

To complete the file we need to add a new column that indicates the depth where each sample stops (Depth of the “From” column + 1m) :

hs_assay.sort_values(by=["Hole_ID", "From"], inplace=True)
hs_assay
Hole_ID From Fe_pct Al2O3 SiO2_pct K2O_pct CaO_pct MgO_pct TiO2_pct P_pct S_pct Mn_pct LOI Fe_ox_ai hem_over_goe kaolin_abundance kaolin_composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
0 RKC278 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1290 891.13 0.0374 0.999 NaN NaN NaN NaN
1 RKC278 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1460 892.68 0.0269 1.006 NaN NaN NaN NaN
2 RKC278 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1650 895.24 NaN NaN NaN NaN NaN NaN
3 RKC278 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1000 893.34 NaN NaN 0.0545 2211.83 NaN NaN
4 RKC278 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0445 910.32 NaN NaN NaN NaN 0.111 2312.89
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7501 RKC485 41.0 28.0 9.80 39.05 0.037 0.08 0.22 1.078 0.027 0.006 0.12 9.00 0.2210 912.17 0.0322 1.004 NaN NaN NaN NaN
7502 RKC485 42.0 39.0 7.67 25.15 0.029 0.09 0.25 0.689 0.046 0.008 0.11 10.11 0.1200 912.43 0.1140 1.027 NaN NaN NaN NaN
7503 RKC485 43.0 16.0 20.23 43.41 0.177 0.17 0.34 1.617 0.020 0.018 0.05 10.80 0.0956 888.81 0.0306 1.012 NaN NaN NaN NaN
7504 RKC485 44.0 12.0 12.53 50.24 0.060 0.26 0.25 1.473 0.006 0.779 0.03 16.18 0.0378 958.21 0.1100 1.025 NaN NaN NaN NaN
5047 RKD015 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

7108 rows × 21 columns

hs_assay.insert(2, "To", hs_assay["From"] + 1)
hs_assay
Hole_ID From To Fe_pct Al2O3 SiO2_pct K2O_pct CaO_pct MgO_pct TiO2_pct P_pct S_pct Mn_pct LOI Fe_ox_ai hem_over_goe kaolin_abundance kaolin_composition wmAlsmai wmAlsmci carbai3pfit carbci3pfit
0 RKC278 0.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1290 891.13 0.0374 0.999 NaN NaN NaN NaN
1 RKC278 1.0 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1460 892.68 0.0269 1.006 NaN NaN NaN NaN
2 RKC278 2.0 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1650 895.24 NaN NaN NaN NaN NaN NaN
3 RKC278 3.0 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.1000 893.34 NaN NaN 0.0545 2211.83 NaN NaN
4 RKC278 4.0 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0445 910.32 NaN NaN NaN NaN 0.111 2312.89
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7501 RKC485 41.0 42.0 28.0 9.80 39.05 0.037 0.08 0.22 1.078 0.027 0.006 0.12 9.00 0.2210 912.17 0.0322 1.004 NaN NaN NaN NaN
7502 RKC485 42.0 43.0 39.0 7.67 25.15 0.029 0.09 0.25 0.689 0.046 0.008 0.11 10.11 0.1200 912.43 0.1140 1.027 NaN NaN NaN NaN
7503 RKC485 43.0 44.0 16.0 20.23 43.41 0.177 0.17 0.34 1.617 0.020 0.018 0.05 10.80 0.0956 888.81 0.0306 1.012 NaN NaN NaN NaN
7504 RKC485 44.0 45.0 12.0 12.53 50.24 0.060 0.26 0.25 1.473 0.006 0.779 0.03 16.18 0.0378 958.21 0.1100 1.025 NaN NaN NaN NaN
5047 RKD015 0.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

7108 rows × 22 columns

To organize these datas we can group them in ascendant Hole_ID and ascendant From so we will have every borehole in alphabetic order and for every borehole its samples from the most superficial to the deepest.

This last correction is again very situational, but in our case we had to create on the spreadsheet the column “To” on the basis of the column “From”. The problem is that this kind of manipulation sometimes results in a wrong type of value in these boxes, so we will apply a function to put everything in float.

hs_assay["To"] = pd.to_numeric(hs_assay["To"], downcast="float")
hs_assay.to_csv("../data/hyperspec.csv", index=False)