fn read_nc_by_header(file_path: &str, header: Vec<&str>) -> Result<Self, Box<dyn Error>> {
        let f = netcdf::open(file_path)?;
        let mut df = DataFrame::new(vec![]);
        for h in header {
            let v = match f.variable(h) {
                Some(val) => val,
                None => panic!("There are no corresponding values"),
            };
            if v.vartype().is_string() {
                let mut data: Vec<String> = vec![Default::default(); v.len()];
                for i in 0..v.len() {
                    data[i] = v.string_value(Some(&[i]))?;
                }
                df.push(&h, Series::new(data));
            } else {
                let dtype = vtype_to_dtype(v.vartype().as_basic().unwrap());
                let series = dtype_match!(N; dtype, vec![], |vec| nc_read_value(&v, vec); Vec)?;
                df.push(&h, series);
            }
        }
        Ok(df)
    }
Read netcdf to DataFrame with specific header

# Example

```
#[macro_use]
extern crate peroxide;
use peroxide::fuga::*;

fn main() -> Result<(), Box<dyn Error>> {
let mut df = DataFrame::new(vec![]);
df.push("a", Series::new(vec![1,2,3,4]));
df.push("b", Series::new(vec!['a', 'b', 'c', 'd']));
df.push("c", Series::new(c!(0.1, 0.2, 0.3, 0.4)));
df.write_nc("example_data/doc_nc2.nc")?;

let dg = DataFrame::read_nc_by_header("example_data/doc_nc2.nc", vec!["a", "c"])?;

df.drop("b");

assert_eq!(df, dg);

Ok(())
}
```
src/structure/dataframe.rs