专栏首页庄闪闪的R语言手册给数据科学家的10个提示和技巧Vol.3

给数据科学家的10个提示和技巧Vol.3

原文10 Tips And Tricks For Data Scientists Vol.3[1]

译者:赵西西

原博客简介:Predictive Hacks是与数据科学相关的一切的在线资源中心。该博客由一群数据科学家所运营,专注于讲解在各种领域如何使用大数据技术(从机器学习和人工智能到业务领域)。

1 引言

前面已经介绍了一些数据分析的技巧,主要是用Python和R实现。具体内容可见:翻译|给数据科学家的10个提示和技巧Vol.1翻译|给数据科学家的10个提示和技巧Vol.1翻译|记住一些常用的R包翻译|R用于研究,Python用于生产

2 R

2.1 判断两个数据框之间的相关性

两个数据框,如下:

df1 = data.frame(x11 = c(10,20,30,40,50,55,60),
                 x12 = c(11,15,20,30,35,60,70)
                 )
df2 = data.frame(x21 = c(100,150,200,250,300,400,500),
                 x22 = c(110,150,180,250,300,400,600)
                 )

接着,直接利用cor()函数即可得到相关系数矩阵,矩阵的第一个元素表示x11和x21之间的相关程度,其他元素含义类似:

> cor(df1,df2)
          x21       x22
x11 0.9538727 0.9000503
x12 0.9889076 0.9755973

2.2 计数神器——“Count(Case When … Else … End)”语句

在SQL中,Count(Case When … Else … End)是一个使用频率非常高的计数语句。现在通过一个例子来说明如何在dplyr中实现同样的操作:

library(sqldf)
library(dplyr)
df<-data.frame(id = 1:10,
               gender = c("m","m","m","f","f","f","m","f","f","f"),
               amt= c(5,20,30,10,20,50,5,20,10,30))
df
> df
   id gender amt
1   1      m   5
2   2      m  20
3   3      m  30
4   4      f  10
5   5      f  20
6   6      f  50
7   7      m   5
8   8      f  20
9   9      f  10
10 10      f  30

要想获得不同的列中每个性别的人数和总和, 在R中利用SQL语句实现的方法如下,需要用到sqldf包:

> sqldf("select count(case when gender='m' then id else null end) as male_cnt,
              count(case when gender='f' then id else null end) as female_cnt,
              sum(case when gender='m' then amt else 0 end) as male_amt,
              sum(case when gender='f' then amt else 0 end) as female_amt
              from df")
              
    male_cnt  female_cnt  male_amt female_amt
1        4          6       60        140
>

利用dpylr实现的方法如下,对每一列设置相应的条件进行选择,例如id[gender=="m"]就是在id列中找出male的数据并形成一个子集:

> df%>%summarise(male_cnt=length(id[gender=="m"]),
               female_cnt=length(id[gender=="f"]),
               male_amt=sum(amt[gender=="m"]),
               female_amt=sum(amt[gender=="f"])
               )

    male_cnt  female_cnt  male_amt  female_amt
1        4           6        60        140

3 Python

3.1 在pandas中处理JSON文件

一个pandas的DataFrame,其中一个列是JSON格式的,此时希望提取特定的信息。我们使用Kaggle中的doc_report.csv数据集来示范:

import pandas as pd
import ast
pd.set_option("max_colwidth", 180)
doc = pd.read_csv("doc_reports.csv", index_col=0)
# print the properties column
doc['properties']

查看数据发现有JSON格式的字段,此时需要将其转换为字典,再提取所需的信息。先利用ast库将其转换为一个字典,然后为每个键创建单独的列,如下所示:

dummy = doc['properties'].apply(lambda x: ast.literal_eval(x))
doc['gender'] = dummy.apply(lambda x:x.get('gender'))
doc['nationality'] = dummy.apply(lambda x:x.get('nationality'))
doc['document_type'] = dummy.apply(lambda x:x.get('document_type'))
doc['date_of_expiry'] = dummy.apply(lambda x:x.get('date_of_expiry'))
doc['issuing_country'] = dummy.apply(lambda x:x.get('issuing_country'))
# lets get the columns
doc[['gender', 'nationality', 'document_type', 'date_of_expiry','issuing_country' ]]

3.2 利用applymap改变多个列的值

通过一个示例演示如何使用applymap()函数更改pandas数据框中的多个列值。假设DataFrame的值是1、2和3,你想应用下面的映射函数:

  • If 1, then 0.
  • If 2 or 3, then 1.
df = pd.DataFrame({'A':[1,1,2,2,3,3],
'B':[1,2,3,1,2,3]})
df

  A   B
0 1   1
1 1   2
2 2   3
3 2   1
4 3   2
5 3   3

首先根据映射函数创建字典,再对每一列应用applymap()函数:

# 创建映射字典
d = {1 : 0, 2: 1, 3: 1}
# 对每一列应用函数
df.applymap(d.get)

  A   B
0 0   0
1 0   1
2 1   1
3 1   0
4 1   1
5 1   1

3.3 利用Plotly建立树形图

利用plotly.express[2],可以很容易地创建漂亮的树形图。假设我们想要研究各国的预期寿命,同时还要考虑到大陆和该国的人口。在下面的树图中,矩形的大小代表人口,颜色代表寿命。预期寿命越长,颜色越蓝。预期寿命越低,颜色越红。

import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
df["world"] = "world" # in order to have a single root node
fig = px.treemap(df, path=['world', 'continent', 'country'], values='pop',
                  color='lifeExp', hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()

3.4 判断两个数据框之间的相关性

和前面R中的做法类似,python中利用的是corr()函数:

df1 = pd.DataFrame({'x11' : [10,20,30,40,50,55,60],
                    'x12' : [11,15,20,30,35,60,70]})
df2 = pd.DataFrame({'x21' : [100,150,200,250,300,400,500],
                    'x22' : [110,150,180,250,300,400,600]})
pd.concat([df1, df2], axis=1, keys=['df1', 'df2']).corr().loc['df1', 'df2']

     x21      x22
x11 0.953873 0.900050
x12 0.988908 0.975597

只需输入:

(df=='a').any()

A     True
B    False
C     True

3.5 将一个日期值还原到该月的第一天

假设有这样一组数据:

import pandas as pd
df = pd.DataFrame({'MyDate': ['2020-03-11', '2021-04-26', '2021-01-17']})
df['MyDate'] = pd.to_datetime(df.MyDate)
df

    MyDate
0   2020-03-11
1   2021-04-26
2   2021-01-17

而你需要把该日期还原到当月的第一天:

df['Truncated'] = df['MyDate'] + pd.offsets.MonthBegin(-1)
# OR
# df['Truncated'] = df['MyDate'] - pd.offsets.MonthBegin(1)
df

   MyDate     Truncated
0 2020-03-11  2020-03-01
1 2021-04-26  2021-04-01
2 2021-01-17  2021-01-01

3.6 添加多个CSV文件到数据框中

当一个特定的文件夹中有多个CSV文件,此时我们想将它们存储到一个pandas数据框中。假设CSV文件位于My_Folder下:

import os
import pandas as pd
# 创建一个空的数据框
df = pd.DataFrame()
# 遍历 My_Folder中的所有文件
for file in os.listdir("My_Folder"):
    if file.endswith(".csv"):
        df = pd.concat([df , pd.read_csv(os.path.join("My_Folder", file))], axis=0 )
# 将索引重置 
df.reset_index(drop=True, inplace=True)
df

现在df包含了My_Folder中的CSV文件。

3.7 连接多个CSV文件并保存到一个CSV文件中

当一个特定文件夹中有多个CSV文件,此时想将它们连接起来并保存到一个名为merged.csv的文件中。我们可以利用pandas,并在.to_csv()中使用mode=a参数,该参数的含义是追加:

import os
import pandas as pd
# 遍历 My_Folder中的所有文件
for file in os.listdir("My_Folder"):
    if file.endswith(".csv"):
        tmp = pd.read_csv(os.path.join("My_Folder", file))
        tmp.to_csv("merged.csv", index=False, header=False, mode='a')

3.8 连接多个TXT文件并保存到一个TXT文件中

当有多个txt文件,此时想将所有这些文件连接到一个txt文件中。假设txt文件位于dataset文件夹中,首先需要获取这些文件的路径:

import os
# 在文件夹中找到所有文件
inputs = []
for file in os.listdir("dataset"):
    if file.endswith(".txt"):
        inputs.append(os.path.join("dataset", file))
# 将所有文件连接到 merged_file.txt中
with open('merged_file.txt', 'w') as outfile:
    for fname in inputs:
        with open(fname, encoding="utf-8", errors='ignore') as infile:
            outfile.write(infile.read())

通过上面的代码,成功地将所有这些文件连接到一个名为merged_file.txt的文件中。在文件比较大的情况下,可以进行如下操作:

with open('merged_file.txt', 'w') as outfile:
    for fname in inputs:
        with open(fname, encoding="utf-8", errors='ignore') as infile:
            for line in infile:
                outfile.write(line)

参考资料

[1]

10 Tips And Tricks For Data Scientists Vol.3: https://predictivehacks.com/10-tips-and-tricks-for-data-scientists-vol-3/

[2]

plotly.express: https://plotly.com/python/plotly-express/

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:我才是赵西西

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 给数据科学家的10个提示和技巧Vol.4

    原文:10 Tips And Tricks For Data Scientists Vol.4[1]

    庄闪闪
  • 翻译|给数据科学家的10个提示和技巧Vol.2

    原文:10 Tips And Tricks For Data Scientists Vol.2[1]

    庄闪闪
  • 翻译|给数据科学家的10个提示和技巧Vol.1

    原博客简介:Predictive Hacks是与数据科学相关的在线资源中心。该博客是由一群数据科学家运营,专注于讲解在各种领域如何运用大数据技术(从机器学习和人...

    庄闪闪
  • 提高数据科学家讲故事能力的5个小技巧

    讲故事是一门艺术。随着时间的推移,讲故事的技巧、方法和工具发生了变化,但主要概念和目标保持不变,即有效地吸引你的观众,使他们能够真正地与你所说的联系起来。

    deephub
  • 授权首发:徐亦达老师精选论文集和课件下载

    徐亦达老师和他的团队精选了70篇论文,其中包括了非参贝叶斯算法的研究和应用,行列式点过程,3D计算机视觉,带约束下几何优化,非负矩阵分解,视频跟踪,GAN的文字...

    黄博的机器学习圈子
  • 数据科学家必看!处理数据的 7 个小技巧

    在没有最基本的、必要的、未经处理数据的情况下,我们应该如何为机器学习的概念建立原型并加以验证呢?在资源匮乏的情况下,我们应如何有效地获取并用数据创造价值?

    AI研习社
  • 深度学习碰上古文献,西南大学提出基于CNN的古彝文识别方法

    摘要:作为世界六大古文字之一的古彝文记录下几千年来人类发展历史。针对古彝文的识别能够将这些珍贵文献材料转换为电子文档,便于保存和传播。由于历史发展,区域限制等多...

    机器之心
  • 第2期 | 国内脑机接口领域专家教授汇总(修改)

    第1期分享出来后,很多朋友在后台留言表示,这个汇总真是太有用了。说实话自己做的一些事能给他人带去帮助,是非常的开心。

    脑机接口社区
  • 征服数据科学面试的10个小技巧(附资源)

    大数据文摘
  • Smarting:第一款真正意义上的便携式可移动脑电设备

    目前市面上有很多脑电设备都号称是便携式可移动的,但是笔者认为,今天我要介绍的Smarting这款脑电设备才是第一款真正意义上的便携式可移动EEG设备。为什么这样...

    悦影科技
  • 自动机器学习:最近进展研究综述

    深度学习已经运用到多个领域,为人们生活带来极大便利。然而,为特定任务构造一个高质量的深度学习系统不仅需要耗费大量时间和资源,而且很大程度上需要专业的领域知识。

    磐创AI
  • ICRA 2018奖项全公布,中国香港大学团队获最佳会议论文

    ICRA 2018 本周于澳大利亚布里斯班举行。随着会议议程的推进,今天也迎来了本次大会的重头戏——ICRA 相关奖项的颁布仪式

    AI科技评论
  • AutoML: A Survey of the state-of-the-art

    https://arxiv.org/pdf/1908.00709.pdf​arxiv.org

    marsggbo
  • 循环神经网络的增强方法:注意力机制以及更多

    AI 科技评论按:一提起 RNN,我们最容易想到的实现就是 LSTM + attention。LSTM 作为经典的网络结构可谓是老当益壮,而另一方面注意力机制过...

    AI科技评论
  • GitHub上的7个数据科学项目,以展示机器学习技巧!

    轻松应对数据科学项目是一个令人难以置信的方法,以摆脱挑战看看GitHub上的这7个数据科学项目将改善成熟能力范围这些GitHub仓库包含来自各种数据科学领域的项...

    代码医生工作室
  • 【综述】自动机器学习最近研究进展

    本文首先从端到端系统的角度总结了自动机器学习在各个流程中的研究成果,然后着重对最近广泛研究的神经结构搜索进行了总结,最后讨论了一些未来的研究方向。

    yuquanle
  • 自动机器学习:最近进展研究综述

    本文首先从端到端系统的角度总结了自动机器学习在各个流程中的研究成果,然后着重对最近广泛研究的神经结构搜索进行了总结,最后讨论了一些未来的研究方向。

    AI科技评论
  • 独家起底巧达科技:“玩转”8亿人数据的灰色生意

    日前,有消息称招聘数据公司巧达科技被查封,全体员工被警方带走。一位巧达科技前员工告诉燃财经(ID:rancaijing),“(最近)陆续有HR等非核心员工回家,...

    大数据文摘
  • 【系列文章】面向自动驾驶的三维点云处理与学习(6)-完结篇

    标题:3D Point Cloud Processing and Learning for Autonomous Driving

    点云PCL博主

扫码关注云+社区

领取腾讯云代金券