Получение массива значений в ячейку внутри фрейма данных

#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}]}]