#python #r #json #data-manipulation
#python #r #json #манипулирование данными
Вопрос:
Обновление: я переформулировал и переосмыслил это, и я думаю, что вопрос лучше задать так.
Итак, я взламывал это вечно, но безуспешно. Вот пример того, что я собираюсь сделать.
Я начинаю с фрейма данных:
df = data.frame("one" = c(1,11), "two" = c(2,22), "three" = c(3,33))
one two three
1 2 3
11 22 33
Я пытаюсь превратить вышесказанное в это:
one new
1 c(2,3)
11 c(22,33)
Я пробовал несколько способов, таких как вложение двух столбцов и попытка сопоставления по ним и т.д. Возможно, есть что-то простое, чего я здесь не вижу. Я бы предпочел сделать это в R через tidyverse, но на данный момент я открыт для чего угодно.
Так и должно быть, потому что при преобразовании в JSON значения в разделе ‘new’ должны быть в виде [1,2,3] и [11,22,33]. Может быть, в Python это проще?
Я использую пакет jsonlite в R для преобразования в / из JSON.
Спасибо за помощь.
Комментарии:
1. @thelatemail, спасибо за ответы.. Я отредактировал вопрос.. надеюсь, теперь это понятнее.
Ответ №1:
Я думаю, что это должно быть просто Map
упражнением:
df$new <- Map(c, df$two, df$three)
df
# one two three new
#1 1 2 3 2, 3
#2 11 22 33 22, 33
library(jsonlite)
toJSON(df[c("one","new")])
#[{"one":1,"new":[2,3]},{"one":11,"new":[22,33]}]
Если у вас много переменных, вы можете обернуть их в do.call
, чтобы это тоже было сделано:
df$new <- do.call(Map, c(c,df[2:3]))
Если вы предпочитаете tidyverse, вы можете мурлыкать это как:
map2(df$two, df$three, c)
Ответ №2:
В python с помощью pandas
:
import pandas as pd
df = pd.DataFrame([[1,2,3],[11,22,33]], columns=["one", "two","three"])
one two three
0 1 2 3
1 11 22 33
df['new'] = list(zip(df.two, df.three))
df[['one','new']].to_json(orient='records')
# '[{"one":1,"new":[2,3]},{"one":11,"new":[22,33]}]'
Ответ №3:
В R вы можете использовать tidyr::nest()
, после того как вы group_by()
:
library(dplyr)
nest_df <- df %>%
group_by(one) %>%
tidyr::nest(c(two, three), .key="new")
# # A tibble: 2 x 2
# one new
# <dbl> <list>
# 1 1 <tibble [1 x 2]>
# 2 11 <tibble [1 x 2]>
Теперь столбец new
в каждой строке является tibble()
.
nest_df[1, ][[2]]
# # A tibble: 1 x 2
# two three
# <dbl> <dbl>
# 1 2 3
toJSON()
:
df %>%
group_by(one) %>%
tidyr::nest(c(two, three), .key="new") %>%
jsonlite::toJSON()
#[{"one":1,"new":[{"two":2,"three":3}]},{"one":11,"new":[{"two":22,"three":33}]}]