【问题标题】:How to extract and create a new column in a data set, based on an already existing column如何根据现有列在数据集中提取和创建新列
【发布时间】:2018-11-26 19:15:37
【问题描述】:

我的数据集中 2 列的示例切片,以后需要。

**City**    **Ranking**
 Boston        9  of 2972
 Boston        60 of 2972
 Miami         6  of 1444
 Miami         200 of 1444
 Miami          3  of 1444
 Miami          1  of 1444

我想创建一个名为individual.rank 的新列。它基于Ranking 列。我知道如何打印与每个城市相关的数据行,我只需要知道如何提取以及如何处理individual.rank 列。 结果应该类似于迈阿密的表格,例如:

**City**   **Ranking**  **individual.rank**
 Miami       1 of 1444          1
 Miami       2 of 1444          2
 Miami       3 of 1444          3

Ranking 进行排序,我可以针对特定城市这样做:

MiamiTable = data.loc[data['City'] == 'Miami']
MiamiTable.sort_values('Ranking')

我在 R 中使用了我不理解的函数和正则表达式。但我不知道如何在 Python 中做到这一点。 (df.restaurant.data是数据集):

pattern <- "[0-9?,]+" # 
pattern.end <- "[0-9?,]+$"
df.restaurant.data <- df.restaurant.data %>%  
    mutate(individual.rank = str_replace(str_extract(Ranking, pattern),
                                         ",", "") %>% 
               as.numeric())

【问题讨论】:

  • 你需要一个既懂R又懂Python的dplyr-variant的人。代码似乎只是使用正则表达式来提取带逗号的数字。为什么 ”?”是在一个字符类里面虽然有点谜。为什么将带逗号的数字字符串传递给as.numeric 应该在 R 中工作也是一个难题。我怀疑这是经过可靠测试的 R 代码。我的建议:编辑你的问题,把所有的“我”都大写,因为我们中的许多人认为这是懒惰和不尊重你的读者的标志,并从粗略的 R 代码中删除翻译请求。
  • 通常一个问题需要一些代码,我可以粘贴并运行这些代码来复制您在任务中的进度或您的错误,否则它是一个“做我的工作”调用,这在 Stackoverflow 上没有得到广泛的赞赏
  • 我只需要了解如何为迈阿密等城市或任何其他城市创建表格,并将我想要的新列和排名安排为上面发布的新表格。你可以忽略 R 代码片段并尝试专注于如何在 Python 中实现它,因为这是我的难点。

标签: python r regex


【解决方案1】:

你应该使用两个 R 包:tidyr 和 dplyr:

library(tidyr)
library(dplyr)

df <- tibble(City = c("Boston", "Boston", rep("Miami", 4)),
             Ranking = c("9  of 2972",
                         "60 of 2972",
                         "6  of 1444",
                         "200 of 1444",
                         "3  of 1444",
                         "1  of 1444"))

df %>% 
  separate(col = Ranking, into = c("individual.rank", "total"), 
           sep = "of", remove = FALSE) %>%
  mutate_at(vars("individual.rank"), as.integer) %>% 
  select(-total)

# A tibble: 6 x 3
  City   Ranking     individual.rank
  <chr>  <chr>                 <int>
1 Boston 9  of 2972                9
2 Boston 60 of 2972               60
3 Miami  6  of 1444                6
4 Miami  200 of 1444             200
5 Miami  3  of 1444                3
6 Miami  1  of 1444                1

【讨论】:

    【解决方案2】:

    你在使用pandas吗?如果是这样,这似乎实现了您所追求的。

    MiamiTable = data.loc[data['City'] == 'Miami']
    
    MiamiTable['individual_rank'] = MiamiTable.Ranking.str.replace(r' .*', '').astype('int')
    

    执行字符串替换以删除(包括)第一个空格之后的任何内容,然后将结果转换为整数。然后排序:

    MiamiTable.sort_values('individual_rank')
    
    
        City      Ranking  individual_rank
    5  Miami   1  of 1444                1
    4  Miami   3  of 1444                3
    2  Miami   6  of 1444                6
    3  Miami  200 of 1444              200
    

    【讨论】:

      【解决方案3】:

      您可以在类似于df$new_col &lt;- gsub(".*of","", df$original_col) 的地方使用正则表达式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 2021-06-05
        • 2021-04-19
        • 2021-02-08
        • 2020-01-29
        相关资源
        最近更新 更多