#dataframe #go #data-structures #struct
#фрейм данных #Вперед #структуры данных #структура
Вопрос:
У меня есть опыт работы с Python и R, и я привык работать с фреймами данных. Если у меня есть следующая таблица:
>>> table
ID Phone Email Value
------------------------------
ID1 15555555555 None None
ID2 None 3Email None
ID3 3123 4Email aaa
вывод двух таблиц из table
будет выглядеть следующим образом:
>>> table1=table[["ID","Phone","Email"]]
>>> table1
ID Phone Email
------------------------
ID1 15555555555 None
ID2 None 3Email
ID3 3123 4Email
>>> table2=table[["ID","Value"]]
>>> table2
ID Value
---------
ID1 None
ID2 None
ID3 aaa
Теперь я пытаюсь добиться того же с Golang. Ниже приведен мой первый шаг:
package main
import (
"fmt"
)
type Identification struct {
ID string
Phone int64
Email string
Value string
}
func main() {
// define slice of Identification
var idents []Identification
idents = append(idents, Identification{ID: "ID1", Phone: 15555555555})
idents = append(idents, Identification{ID: "ID2", Email: "3Email"})
idents = append(idents, Identification{ID: "ID3", Phone:3123, Email: "4Email", Value: "aaa"})
fmt.Println(idents)
}
Результат:
[{ID1 15555555555 } {ID2 0 3Email } {ID3 3123 3Email aaa}]
Мой вопрос в том, как я могу нарезать idents
так же, как я сделал с Python в примере?
Комментарии:
1. A
struct
имеет фиксированную «форму», поэтому вы не можете сделать это напрямую. Хотя, зачем вам это нужно? Вы можете просто оставить поля там и игнорировать их во время обработки.2. Это похоже на проблему XY. Какова ваша конечная цель?
3. @Flimzy моя цель — импортировать данные строки из источника, а затем нарезать их в соответствии с определенными ключами и вставить в разные таблицы в базе данных
4. Тогда нет необходимости «нарезать» его в структурах. Просто вставьте только нужные вам столбцы в соответствующие таблицы.
Ответ №1:
Структуры в go не могут быть разделены, все, что вы могли бы сделать, это сбросить значения полей, от которых вы хотите избавиться.
Вам понадобится map
для достижения того, что вы видите в Python. Но Go — это типизированный язык, поэтому для хранения произвольных данных вы можете использовать interface{}
тип. Поэтому вам нужно будет сделать это с помощью map[string]interface{}
, поскольку вы храните данные разных типов, в противном случае сделайте все строками и используйте map[string]string
.
Тогда для нарезки в стандартном пакете well go нет ничего для нарезки столбцов. К счастью, некоторые люди работали над пакетами с открытым исходным кодом, чтобы упростить вам жизнь 🙂 Я предлагаю вам этотhttps://github.com/go-gota/gota
Если вам нужно сделать это самостоятельно, вы могли бы сделать это:
package main
import "fmt"
type table []map[string]interface{}
func (t table) sliceColumns(cols ...string) table {
// create our new resulting table
var newTable = make(table, len(t))
// loop through table and populate our newTable
for i, m := range t {
var n = make(map[string]interface{}, len(cols))
for _, col := range cols {
if v, ok := m[col]; ok {
n[col] = v
}
}
newTable[i] = n
}
return newTable
}
func main() {
// define slice of Identification
var t = table{
{
"ID": "1",
"Phone": 155555,
},
{
"ID": "2",
"Email": "3Email",
},
{
"ID": "3",
"Email": "4Email",
"Value": "aaaa",
"Phone": "123",
},
}
fmt.Println(t.sliceColumns("ID", "Phone")) // [map[ID:1 Phone:155555] map[ID:2] map[ID:3 Phone:123]]
}