美文网首页R语言
[Python/R语言] 用R和python解决数据分析120题

[Python/R语言] 用R和python解决数据分析120题

作者: 半为花间酒 | 来源:发表于2020-04-14 11:19 被阅读0次

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒)
    若公众号内转载请联系公众号:早起Python
    题源:
    公众号 早起python 《Pandas进阶修炼120题》

    数据分析120题系列:

    为什么出这个专题:

    R语言和pandas都是数据处理的重要工具
    而二者的高下争论时有存在
    我相信对于数据而言没有绝对的孰优孰劣
    需要做的应该是在必要时权衡最合适的办法

    感谢 公众号早起python 提供数据分析120题
    这些题目是一个契机
    帮助我比较了两种语言处理不同问题的共性
    当然也发现了各自的灵活和缺陷

    它们覆盖多数数据分析初期可能遇到的问题
    无论是对R语言还是对python技能的提升
    相信都有很大帮助

    (陈熹 2020年4月)

    • python解法
    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame(data)
    
    # 假如是直接创建
    df = pd.DataFrame({
        "grammer": ["Python","C","Java","GO",np.nan,"SQL","PHP","Python"],
        "score": [1,2,np.nan,4,5,6,7,10]})
    
    • R解法
    # R中没有字典概念,故直接创建dataframe/tibble
    #> 第一种
    df <- data.frame(
      "grammer" = c("Python","C","Java","GO",NA,"SQL","PHP","Python"),
      "score" = c(1,2,NA,4,5,6,7,10)
    )
    
    #> 第二种
    library(tibble)
    df <- tibble(
      "grammer" = c("Python","C","Java","GO",NA,"SQL","PHP","Python"), 
      "score" = c(1,2,NA,4,5,6,7,10)
    )
    
    # 也可以用tribble横向建tibble
    
    pandas / R
    • python解法
    #> 1
    df[df['grammer'] == 'Python']
    
    #> 2
    results = df['grammer'].str.contains("Python")
    results.fillna(value=False,inplace = True)
    df[results]
    
    • R解法
    df[which(df$grammer == 'Python'),]
    
    pandas / R
    • python解法
    df.columns
    # Index(['grammer', 'score'], dtype='object')
    
    • R解法
    names(df)
    # [1] "grammer" "score"  
    

    • python解法
    df.rename(columns={'score':'popularity'}, inplace = True)
    
    • R解法
    df <- df %>% 
      rename(popularity = score)
    

    • python解法
    df['grammer'].value_counts()
    
    • R解法
    # 神方法table
    table(df$grammer)
    
    pandas / R
    • python解法
    # pandas里有一个插值方法,就是计算缺失值上下两数的均值
    df['popularity'] = df['popularity'].fillna(df['popularity'].interpolate())
    
    • R解法
      暂时没想到其他方法,用的是Hmisc包
    library(Hmisc)
    index <- which(is.na(df$popularity))
    df$popularity <- impute(df$popularity,
                           (unlist(df[index-1, 2] + 
                                   df[index+1, 2]))/2)
    
    pandas / R
    • python解法
    df[df['popularity'] > 3]
    
    • R解法
    df %>% 
      filter(popularity > 3)
    # 等价于
    df[df$popularity > 3,] # 这种方法跟pandas很相似
    
    pandas / R
    • python解法
    df.drop_duplicates(['grammer'])
    
    • R解法
    df[!duplicated(df$grammer),]
    
    pandas / R
    • python解法
    df['popularity'].mean()
    # 4.75
    
    • R解法
    #> 第一种
    mean(df$popularity)
    # [1] 4.75
    
    #> 第二种
    df %>% 
      summarise(mean = mean(popularity))
    ## A tibble: 1 x 1
    #     mean
    #    <dbl>
    #  1  4.75
    

    • python解法
    df['grammer'].to_list()
    # ['Python', 'C', 'Java', 'GO', nan, 'SQL', 'PHP', 'Python']
    
    • R解法
      R中的list和python的list意义完全不同
      接近python的list概念的应该是R中的vector
      实际上这题目的就是降维,用的反而是unlist
    unlist(df$grammer)
    # [1] "Python" "C"      "Java"   "GO"     NA       "SQL"    "PHP"    "Python"
    

    • python解法

    python还有其他处理EXCEL的包比如 openpyxl、xlrd、xlwt、xluntils等
    本例用pandas的写入方法解决

    df.to_excel('filename.xlsx')
    
    • R解法

    R对EXCEL文件不太友好
    第一种方法:利用readr包转为csv再用EXCEL打开
    文件本质依然是csv

    library(readr)
    write_excel_csv(df,'filename.csv')
    

    第二种方法:利用openxlsx包

    openxlsx::write.xlsx(df,'filename.xlsx')
    

    也可以用xlsx包,但需要先配置JAVA环境
    确保JAVA配置到环境变量中并命名为JAVA_HOME

    Sys.getenv("JAVA_HOME")
    install.packages('rJava')
    install.packages("xlsxjars")
    library(rJava)
    library(xlsxjars)
    xlsx::write.xlsx(df,'filename.xlsx')
    

    • python解法
    df.shape
    # (8, 2)
    
    • R解法
    dim(df)
    # [1] 8 2
    

    • python解法
    df[(df['popularity'] > 3) & (df['popularity'] < 7)]
    
    • R解法
    library(dplyr)
    df %>% 
      filter(popularity > 3 & popularity <7)
    # 等价于
    df[(df$popularity > 3) & (df$popularity <7),]
    
    pandas / R
    • python解法
    temp = df['popularity']
    df.drop(labels=['popularity'], axis=1,inplace = True)
    df.insert(0, 'popularity', temp)
    
    • R解法
    df <- df %>% 
        select(popularity,everything())
    
    pandas / R
    • python解法
    df[df['popularity'] == df['popularity'].max()]
    
    • R解法
    df %>% 
      filter(popularity == max(popularity)) 
    # 同理也有类似pandas的方法
    df[df$popularity == max(df$popularity),]
    
    pandas / R
    • python解法
    df.tail()
    
    • R解法
    # R中head和tail默认是6行,可以指定数字
    tail(df,5)
    
    pandas / R
    • python解法
    df = df.drop(labels=df.shape[0]-1)
    
    • R解法
    df[-dim(df)[1],]
    # 等价于
    df %>% 
      filter(rownames(df) != max(rownames(df))) 
    
    pandas / R
    • python解法
    row = {'grammer':'Perl','popularity':6.6}
    df = df.append(row,ignore_index=True)
    
    • R解法
    row <- c(6.6,'Perl') # 需要和列的位置对应
    # 或者建数据框
    row <- data.frame(
      "grammer" = c("Perl"),
      "popularity" = c(6.6)
    )
    
    df <- rbind(df,row)
    
    pandas / R
    • python解法
    df.sort_values("popularity",inplace=True)
    
    • R解法
    df <- df %>% 
      arrange(popularity)
    
    pandas / R

    从本题开始将grammer列中的缺失值替换为R

    • python解法
    df['grammer'] = df['grammer'].fillna('R')
    
    df['len_str'] = df['grammer'].map(lambda x: len(x))
    
    • R解法
    library(Hmisc)
    library(stringr)
    df$grammer <- impute(df$grammer,'R')
    str_length(df$grammer)
    
    df$len_str <- str_length(df$grammer)
    
    pandas / R

    相关文章

      网友评论

        本文标题:[Python/R语言] 用R和python解决数据分析120题

        本文链接:https://www.haomeiwen.com/subject/gjhomhtx.html