数据分析之 Pandas

上一次我分享了 Numpy 的学习心得,没看过的朋友点这里 numpy

这次我们学习另一个非常重要的工具 Pandas,很多小伙伴可能已经听说过 pandas 了,pandas 是基于 numpy 构建的含有更高级数据结构和分析能力的工具包,功能更强大,我们趁热打铁,在学完上面的 Numpy 后把 pandas 学到手。

pandas 有两种数据结构:Series 和 DataFrme

Series 是个定长的字典序列,在存储的时候相当于两个 ndarray。Series有两个基本属性:index 和 values, index 默认是 0, 1, 2.....,我们也可以自己指定比如:index = ['a', 'b', 'c', 'd']

import pandas as pd
from pandas import Series, DataFrame

a = Series([1, 2, 3, 4])
c = Series(data=(1, 2, 3, 4), index=['a', 'b', 'c', 'd'])
print(a)
print(c)

输出结果

0    1
1    2
2    3
3    4
dtype: int64
a    1
b    2
c    3
d    4
dtype: int64

我们也可以像创建字典一样创建 Series

f = {'a':1, 'b': 2, 'c': 3}
x1 = Series(f)
print(x1)
a    1
b    2
c    3
dtype: int64

DataFrame 包含了行索引和列索引,类似于数据库表。

期末了,我们虚构几个同学考试的场景,输出考试成绩。

import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [68, 88, 78, 98], 'Math': [14, 67, 88, 65], 
'English': [100, 55, 87, 98]}
df1 = DataFrame(data)
df2 = DataFrame(data, index=['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'])
print(df1)
print(df2)

output

 Chinese  Math  English
0       68    14      100
1       88    67       55
2       78    88       87
3       98    65       98
          Chinese  Math  English
Zhangsan       68    14      100
Lisi           88    67       55
Wangwu         78    88       87
Zhaoliu        98    65       98

df2 中,行索引是 ['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'],列索引是 ['Chinese', 'Math', 'English']。

数据清洗

数据清洗是数据处理过程中必不可少的环节,Pandas 为我们提供了许多工具,这里我简单介绍下 Pandas 数据清洗的工具。

以上面考试做例子。

data = {'Chinese': [68, 88, 78, 98], 'Math': [14, 67, 88, 65],
 'English': [100, 55, 87, 98]}
df = DataFrame(data, index=['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'], 
columns=['English', 'Math', 'Chinese'])
print(df)
          English  Math  Chinese
Zhangsan      100    14       68
Lisi           55    67       88
Wangwu         87    88       78
Zhaoliu        98    65       98
1. 删除某行或某列

比如把 '语文' 这列删掉。把 " Zhangsan " 这行删掉

df = df.drop(columns=['Chinese'])
df = df.drop(index=['Zhangsan'])
重命名列名 columns
df.rename(columns={'Chinese': '语文'}, inplace=True)
去除重复的值
df = df.drop_duplicates()
格式问题
# 更改数据格式
df["Chinese"].astype('str')
df["Chinese"].astype(np.int64)

# 删除数据间的空格
df['Chinese'] = df2['Chinese'].map(str.strip) # 删除左右两边空格
df['Chinese'] = df2['Chinese'].map(str.lstrip) # 删除左边空格
df['Chinese'] = df2['Chinese'].map(str.rstrip) # 删除右边空格


df['Chinese'] = df2['Chinese'].str.strip('$') 
# 去除特殊符号
大小写转换
# 全部大写
df.columns = df.columns.str.upper()
# 全部小写
df.columns = df.columns.str.lower()
# 首字母大写
df.columns = df.columns.str.title()
查找空值

有些字段可能存在空值,我们需要用 pandas 的 isnull 函数进行查找。
比如下面这个数据表

         English  Math  Chinese
Zhangsan      100   NaN       68
Lisi           55  67.0       88
Wangwu         87  88.0       78
Zhaoliu        98  65.0       98

我们用 df.isnull() 查看哪里出现空值,用 df.isnull().any() 查看那一列出现空值。

print(df.isnull())
          English   Math  Chinese
Zhangsan    False   True    False
Lisi        False  False    False
Wangwu      False  False    False
Zhaoliu     False  False    False

可以看到第一行第二列出现空值

print(df.isnull().any())
English    False
Math        True
Chinese    False
dtype: bool

数学这一列出现空值

使用 apply 函数进行清洗

比如对 name 列的数值进行大写转化

df['name'] = df['name'].apply(str.upper)

比如对某一列的数值 * 3 倍返回。

def triple_df(x):
    return 3 *x
df['Chinese'] = df['Chinese'].apply(triple_df)
print(df)
          English  Math  Chinese
Zhangsan      100    78      204
Lisi           55    67      264
Wangwu         87    88      234
Zhaoliu        98    65      294

定义更复杂的函数,我们新增两列,其中 'new1' 是 " Chinese " 和 " Math " 之和的 m 倍, 'new2' 是 " Chinese " 和 " Math " 之和的 n 倍。

def plus(df, n, m):
    df['new1'] = (df['Chinese'] + df['Math']) * m
    df['new2'] = (df['Chinese'] + df['Math']) * n
    return df

df = df.apply(plus, axis=1, args=(2, 3))
print(df)
       English  Math  Chinese  new1  new2
Zhangsan      100    78       68   438   292
Lisi           55    67       88   465   310
Wangwu         87    88       78   498   332
Zhaoliu        98    65       98   489   326
数据统计

我们直接用 describe() 函数,可以对数据进行全面的了解。

print(df.describe()) 
       English       Math    Chinese
count    4.000000   4.000000   4.000000
mean    85.000000  74.500000  83.000000
std     20.800641  10.661457  12.909944
min     55.000000  65.000000  68.000000
25%     79.000000  66.500000  75.500000
50%     92.500000  72.500000  83.000000
75%     98.500000  80.500000  90.500000
max    100.000000  88.000000  98.000000
练习题

学了后一定要练习,练习,练习,你才能够成长。
对于下表数据,请使用 Pandas 中的 DataFrame 进行创建,并对数据进行清洗。同时新加一列求每个人的三科成绩。(尽可能用到所有知识)

练习题

在评论区与我分享你的答案。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容