【问题标题】:Creating new variables based on two columns as index one column as new variable names python pandas or R基于两列创建新变量作为索引一列作为新变量名称python pandas或R
【发布时间】:2015-02-09 12:03:32
【问题描述】:

如果您在阅读问题后有更好的措辞,请帮我修改标题。

我的数据如下所示:

Location    Date    Item    Price
 12           1       A       1
 12           2       A       2      
 12           3       A       4
 13           1       A       1
 13           2       A       4
 12           1       B       1
 12           2       B       8
 13           1       B       1
 13           2       B       2
 13           3       B       11

我想使用位置和日期为每个商品创建一个新变量,即商品价格,例如,我想要的输出是:

Location    Date    PriceA   PriceB
 12           1       1       1
 12           2       2       8      
 12           3       4       NaN
 13           1       1       1
 13           2       4       2
 13           3       NaN     11

【问题讨论】:

    标签: python r pandas panel


    【解决方案1】:

    你可以试试 reshapebase R

     reshape(df, idvar=c('Location', 'Date'), timevar='Item', direction='wide')
     #    Location Date Price.A Price.B
     #1        12    1       1       1
     #2        12    2       2       8
     #3        12    3       4      NA
     #4        13    1       1       1
     #5        13    2       4       2
     #10       13    3      NA      11
    

    或者

    library(reshape2)
    dcast(df, Location+Date~paste0('Price',Item), value.var='Price')
    #    Location Date PriceA PriceB
    #1       12    1      1      1
    #2       12    2      2      8
    #3       12    3      4     NA
    #4       13    1      1      1
    #5       13    2      4      2
    #6       13    3     NA     11
    

    或者您可以在转换为data.table 后使用dcast.data.table(会更快)

    library(data.table)
    dcast.data.table(setDT(df)[,Item:=paste0('Price', Item)],
                                             ...~Item, value.var='Price')
    

    或者

    library(tidyr)
    library(dplyr)
    spread(df, Item, Price) %>%
                          rename(PriceA=A, PriceB=B)
    #   Location Date PriceA PriceB
    #1       12    1      1      1
    #2       12    2      2      8
    #3       12    3      4     NA
    #4       13    1      1      1
    #5       13    2      4      2
    #6       13    3     NA     11
    

    更新

    如果您不需要Price 作为前缀,只需:

    dcast.data.table(setDT(df), ...~Item, value.var='Price')
    

    reshape2 选项将是

    dcast(df,...~Item, value.var='Price')
    

    数据

    df <- structure(list(Location = c(12L, 12L, 12L, 13L, 13L, 12L, 12L, 
    13L, 13L, 13L), Date = c(1L, 2L, 3L, 1L, 2L, 1L, 2L, 1L, 2L, 
    3L), Item = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"
    ), Price = c(1L, 2L, 4L, 1L, 4L, 1L, 8L, 1L, 2L, 11L)), .Names = c("Location", 
    "Date", "Item", "Price"), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

    • 我现在正在运行第一个解决方案。我有 266 个独特的项目,总行数约为 3,000,000。你知道哪个副手更有效吗?
    • @robbieboy74 我正在使用R 3.1.2。你能升级到最新版本的 R 吗?我认为tidyr 是高效的。但是,您可以将data.frame 转换为data.table 并使用dcast.data.table,这样也会更快。
    • @robbieboy74 默认情况下,dcastdplyrdcast.data.table 仅创建 AB。在查看了您的预期输出后,我创建了 PriceA 等。
    • @robbieboy74 使用示例数据集,我没有收到任何错误。
    • 这是一个不错的收藏! tidyr 的强制转换函数只是 dcast AFAICT 的包装器,它不会像 dcast.data.table 那样快/内存效率高。
    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2015-08-01
    • 2019-05-13
    • 2019-01-29
    相关资源
    最近更新 更多