将值数组放入数据框内的单元格中

时间:2019-03-15 00:13:03

标签: python r json data-manipulation

更新:我对此进行了重新措辞和重新思考,我认为最好是这样问这个问题。

所以我一直在这方面做事很运气,没有运气。这是我要做什么的一个例子。

我从一个数据帧开始:

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)

我已经尝试了一些事情,例如嵌套2列并尝试在它们上进行映射等。也许有些简单的事情我在这里没有看到。我更希望通过tidyverse在R中做到这一点,但在这一点上我愿意接受任何事情。

必须这样,因为当将其转换为JSON时,“ new”下的值必须为[1,2,3]和[11,22,33]形式。也许在Python中更容易?

我正在R中使用 jsonlite 包来进行JSON的转换。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我认为这应该只是一次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 是您的喜好,则可以 purrr 如下:

map2(df$two, df$three, c)

答案 1 :(得分:1)

在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]}]'

答案 2 :(得分:1)

tidyr::nest()之后,您可以在R中使用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}]}]