An effort to make a fully featured data frame/wrangling library
package main
import (
	"fmt"
	"github.com/AdikaStyle/go-df/adapters"
	. "github.com/AdikaStyle/go-df/aggs"
	"github.com/AdikaStyle/go-df/backend"
	. "github.com/AdikaStyle/go-df/conds"
	. "github.com/AdikaStyle/go-df/dataframe"
	. "github.com/AdikaStyle/go-df/types"
	"os"
)
func main() {
	orders := adapters.LoadCSV("examples/order_details.csv", '|')
	products := adapters.LoadCSV("examples/products.csv", '|').
		Select("ProductID", "ProductName")
	view := orders.
		Group(By{"ProductID"}, Aggs{"UnitPrice": Sum(), "Quantity": Sum()}).
		OrderBy("ProductID", backend.Asc).
		InnerJoin(products, On("ProductID")).
		Filter(And(
			Gte("UnitPrice", Decimal(600)),
			Gt("Quantity", Decimal(1000))),
		).
		Print(os.Stdout)
	left, right := view.Split(Gte("ProductID", Decimal(30)))
	fmt.Printf("\nLeft side of split:\n")
	left.Print(os.Stdout)
	fmt.Printf("\nRight side of split:\n")
	right.Print(os.Stdout)
}Will print the following:
+--------------------+----------+-----------+------------------------+
|     UnitPrice      | Quantity | ProductID |      ProductName       |
+--------------------+----------+-----------+------------------------+
|  786.5999999999999 |     1057 |         2 | Chang                  |
|  704.2000000000004 |     1158 |        16 | Pavlova                |
|  706.2999999999995 |     1103 |        40 | Boston Crab Meat       |
| 1770.7999999999997 |     1263 |        56 | Gnocchi di nonna Alice |
|               2761 |     1496 |        59 | Raclette Courdavault   |
|             1638.8 |     1577 |        60 | Camembert Pierrot      |
| 2227.7999999999993 |     1083 |        62 | Tarte au sucre         |
|  829.8999999999999 |     1057 |        71 | Flotemysost            |
+--------------------+----------+-----------+------------------------+
Dataframe has 4 columns and 8 rows in total.
Left side of split:
+--------------------+----------+-----------+------------------------+
|     UnitPrice      | Quantity | ProductID |      ProductName       |
+--------------------+----------+-----------+------------------------+
|  706.2999999999995 |     1103 |        40 | Boston Crab Meat       |
| 1770.7999999999997 |     1263 |        56 | Gnocchi di nonna Alice |
|               2761 |     1496 |        59 | Raclette Courdavault   |
|             1638.8 |     1577 |        60 | Camembert Pierrot      |
| 2227.7999999999993 |     1083 |        62 | Tarte au sucre         |
|  829.8999999999999 |     1057 |        71 | Flotemysost            |
+--------------------+----------+-----------+------------------------+
Dataframe has 4 columns and 6 rows in total.
Right side of split:
+-------------------+----------+-----------+-------------+
|     UnitPrice     | Quantity | ProductID | ProductName |
+-------------------+----------+-----------+-------------+
| 786.5999999999999 |     1057 |         2 | Chang       |
| 704.2000000000004 |     1158 |        16 | Pavlova     |
+-------------------+----------+-----------+-------------+
Dataframe has 4 columns and 2 rows in total.
- Predefined type system: Boolean, Integer, Decimal, String, DateTime, Missing.
 - Select columns.
 - Update/Append Columns.
 - Filter by custom condition.
 - Concatenate two data frames.
 - Cast columns to other types.
 - Apply a function to entire column.
 - Split by custom condition.
 - Group by multiple columns with field aggregations.
 - Order by single field (ASC/DESC).
 - Inner join with another data frame.
 - Left join with another data frame.
 - Right join with another data frame.
 - [TODO] Outer join with another data frame.
 - Pretty Print a data frame.
 - Iterate through rows.
 - Iterate through columns.
 - Easy to extend design.
 
- From CSV.
 - To CSV.
 - From SQL.
 - To SQL.
 - [TODO] From Structs.
 - [TODO] To Structs.