У меня есть столбец в фрейме данных, который представляет собой список словарей:
[{"key1": value1, "key2": "value2", "key3": "value3", "key4": "value4"}, {"key1": value1, "key2": "value2", "key3": "value3", "key4": "value4"}]
Есть ли способ расширить этот столбец, чтобы получить что-то вроде этого:
key1 key2 key3 key4
value1 value2 value3 value4
value1 value2 value3 value4
Примечание: key_
может быть любой строкой, value_
может быть любым значением.
Это довольно просто:
julia> df = DataFrame(col=[Dict("key1"=>"value1", "key2"=>"value2", "key3"=>"value3", "key4"=>"value4"),
Dict("key1"=>"value1", "key2"=>"value2", "key3"=>"value3", "key4"=>"value4")])
2×1 DataFrame
Row │ col
│ Dict…
─────┼───────────────────────────────────
1 │ Dict("key2"=>"value2", "key3"=>"…
2 │ Dict("key2"=>"value2", "key3"=>"…
julia> select(df, :col => AsTable)
2×4 DataFrame
Row │ key2 key3 key1 key4
│ String String String String
─────┼────────────────────────────────
1 │ value2 value3 value1 value4
2 │ value2 value3 value1 value4
Единственное ограничение состоит в том, что порядок результирующих столбцов не определен, поскольку Dict
не гарантирует порядок ключей. Вам нужно будет переупорядочить их на втором этапе, например. как это:
julia> select(select(df, :col => AsTable), string.("key", 1:4))
2×4 DataFrame
Row │ key1 key2 key3 key4
│ String String String String
─────┼────────────────────────────────
1 │ value1 value2 value3 value4
2 │ value1 value2 value3 value4
Другой подход:
julia> select(df, :col .=> [ByRow(x -> x["key$i"]) => "key$i" for i in 1:4])
2×4 DataFrame
Row │ key1 key2 key3 key4
│ String String String String
─────┼────────────────────────────────
1 │ value1 value2 value3 value4
2 │ value1 value2 value3 value4
это немного сложнее концептуально и требует, чтобы вы знали, какие ключи вы хотите извлечь, но преимущество в том, что вы выполняете операцию за один раз.