30 个 Pandas技巧,加速你的数据分析处理速度!

6eb2bcbbc099bc7f71019ad72bac9551.png

今天给大家分享的是我日常在做数据处理中总结的一些熊猫技巧

ef9aad577276a155b5aca83da8dcaa3b.png

pandas的下载

使用命令下载:

pip install pandas

401ed92d8a87b6d700cd4332f77c1944.gif

或者自行下载whl文件安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/

050e6a2979fd04df7141c23186a59f80.png

创建DataFrame数据

pd_data = pd.DataFrame({
    "name":["小明","小红","小孙","王小","关宇","刘蓓","张菲"],
    "age":[20,18,27,20,28,18,25],
    "sex":["男","女","男","男","男","女","女"],
    "score":[669,570,642,590,601,619,701],
    "address":["北京","深圳","广州","武汉","深圳","广州","长沙"]
})

print(pd_data)

c36689f80c2ad3ff65de6a34581e4c0e.png

读取本地文件

pd_data = pd.read_excel('./测试.xlsx')

pd.set_option('display.max_columns', None)   # 显示完整的列
pd.set_option('display.max_rows', None)  # 显示完整的行
pd.set_option('display.expand_frame_repr', False)  # 设置不折叠数据

print(pd_data)

3570e309a8aa774ed8aa3dececa1b29f.png

2eb7362ffa7ba36c69abec0b330066b7.gif

查看数据是否有缺失

# 如果缺失显示为True,否则显示False
isnull = pd_data.isnull()        
print(isnull)

baf13afb4628d42c3b4612f31ce527ed.png

统计缺失值个数

# 统计缺失值个数
null_count = pd_data.isnull().sum()
print(null_count)

c7de7a313b520f7c2c5a8656416d9843.png

缺失值填充

# 填充数据 我选择了8.888,你随意
pd_data.fillna(8.888, inplace=True)
print(pd_data)

19ff4caeb66370615aa599191adee6c2.png

608267889d66e9791795ffd868d13228.gif

缺失值删除

# 如果有缺失值,删除此行
exist_col = pd_data.dropna()
print(exist_col)

a807ec2afcd009cb3c7c2917df422fa1.png

查看头尾文件

# 查看头尾文件
print('头文件:', pd_data.head())
print('尾文件:', pd_data.tail())

786dc7fc65048f3928baa46cd7ffcace.png

731f973c983cf152f02c33170c110551.png

取单列值

874986d82e4a1b1ab6236cb1bcfa50ed.png

# 单列值
pd_data = pd.read_excel('./测试.xlsx')
print(pd_data['全款价'])

575eca21ce96af1879203a3054e2cb79.png

2980d84ba2a20944320ba387c04b61d2.png

a0035d4cd36b762107c09175b93c6cbf.png

取多列值

# 多列值
pd_data = pd.read_excel('./测试.xlsx')
print(pd_data[['车辆概况', '全款价']])

9e102b443dc86a5c5e3c95c3bb9b9651.png

单条件取值

e50077cf1f614eb1ee1f4ecd337ce414.png
pd_data = pd.read_excel('./测试.xlsx')
print(pd_data[pd_data['全款价'] == 4])
print('-'*100)
print(pd_data[pd_data['汽车排量'] == '2.0T'])

d1d2016176d3aabc20e1fa924835780e.png

多条件取值-与

660854c0823722741fe0191a1dcb5ce9.png4639d3540f962e69c83620ef2d2f57cb.png

# 多条件筛选数据
print(pd_data[(pd_data['车龄'] == '2018年') & (pd_data['变速箱'] == '自动')])

af96759df4869945783662edbbbc8c40.png

多条件取值-或

b7a5b59681faab8d3a1e56ba715e1e44.png79e56e348cab40379a9ed9d3cfe07994.png

# 多条件筛选数据
print(pd_data[(pd_data['车龄'] == '2018年') | (pd_data['变速箱'] == '自动')])

c98bd02b53326b6718241c4be54c092a.png

79181a624449edd826c63f51eeacea30.gif

字符串的开始函数

2b8a38d5080ec75b43155a3ad36ad66a.gif
# 找出在 车辆概况 中以'大众'开头的
cars = pd_data[pd_data['车辆概况'].str.startswith('大众')]
print(cars)

291007449ce34f91d49912c1020fe69f.png

325fbf2ea91d2420f70f6c63f6b05c18.png

字符串的结尾函数

34de2e1146ddc7797136327cd08cf910.png

# 找出在 车辆概况 中以'豪华型'结尾的
cars = pd_data[pd_data['车辆概况'].str.endswith('豪华型')]
print(cars)

0a4c22c3c0b0464d0503f6e3ad2b0f82.png


7ed8d4a88f67a3f58c1417aa9e8da3d9.png

字符串的包含函数‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

# 找出在 车辆概况 中包含'进口'的
cars = pd_data[pd_data['车辆概况'].str.contains('进口')]
print(cars)

518bd957177369c762d5cb68cfeb3f4d.png

统计元素个数

# 统计 过户分类 以及对应次数
trans_count = pd_data['过户情况'].value_counts()
print(trans_count)

0f1190fabfef9c20d3996ecd9caf5c17.png

为了便于进一步的数据分析,我希望将它们置于不同的数组之中,可以采用如下方法:

# 统计 过户分类 以及对应次数
trans_count = pd_data['过户情况'].value_counts()
# 针对于过户情况的分类
x1_data = trans_count.index.tolist()    
# 分类后各组数据的统计
x2_data = trans_count.tolist()      

print(x1_data)
print(x2_data)

0826fa4f065694f354003ffcedb242db.png

这种格式的数据才是最适合做可视化分析的!

这里再多介绍两种方法,条条大路通罗马

都能轻松实现你的目标。

# 统计 过户分类 以及对应次数
trans_count = pd_data['过户情况'].value_counts()
# 针对于过户情况的分类
x1_data = trans_count.index.tolist()
x11_data = trans_count.index
x12_data = trans_count.index.values
# 类后各组数据的统计
x2_data = trans_count.tolist()
print('index.tolist():', x1_data)
print('index:', x11_data)
print('index.values:', x12_data)
print('x2:', x2_data)

6498a6870a83357ba62a06702a901d8b.png

b5ba30c71037172d1d138a1dd9b55eb6.gif

分割字符串

这个功能也很实用,大家可以看看我的汽车名称数据这一列,我的目标仅仅是车名而已,后面的车型、车龄、排列、变速箱信息对我来说都是冗余信息。

非常不利于我后续数据可视化

所以字符串分割在这里就显得尤为重要。

337fbfa20a2237441950dd35d4e533f2.png

# 对 汽车名称 这一列按照空格分割 并取第一个字符
pd_data['汽车名称'] = pd_data['车辆概况'].map(lambda x: x.split(" ")[0])
name = pd_data['汽车名称'].value_counts()
# 汽车名称分类
name1 = name.index.tolist()  
# 汽车名称对应数量
name2 = name.tolist()  
print(name1)
print(name2)

de319b7fa9918a27b18593151179c43c.png

看到我取出来数据的样子了吗,要的就是这个!

清理数据

当我们相对汽车里程做进一步的分析时会发现数据后面都有一个'万公里',这种数据要做可视化必须先对数据进行处理,

就是先要去除数字后面的字符

e63a0a6a02fc583abbb42f88a75f2ee7.png

我们可以使用字符串的replace()方法,使用空格替换字符

pd_data.loc[:, '表显里程new'] = pd_data['表显里程'].str.replace('万公里', '').astype('float32')  # 去除 30 ’万公里‘
# 保存数据
pd_data.to_excel('测试1.xlsx')

黄色一列是我们处理之前的数据

绿色一列是我们处理之后的数据

已经达到了我们想要的效果

a0888c8c372930ee5a8bc69d10a62fc5.png

2eedeb2436fe7b13efed01dc1b576dc5.gif

划分区间

现在有这么一个需求,我想要按照汽车的行驶里程分类,基本上每个车的行驶里程都是不一样的,如果将每个数据都反映在图标上就会看起来很冗余,

也就失去了作图的意义

所以我们可以按照区间来划分,例如5w-10w公里、10w-15w公里这样图表展示展示出来的效果就会很好了。

170643e77e667aa98dba35885e9eea50.png

pd_data.loc[:, '表显里程new'] = pd_data['表显里程'].str.replace('万公里', '').astype('float32')  # 去除 30 ’万公里‘
# 划分区间
pd_data['里程区间'] = pd.cut(pd_data['表显里程new'], [0, 2, 4, 6, 8, 10, 20],
                             labels=['0-2', '2-4', '4-6', '6-8', '8-10', '>10'])
mile = pd_data['里程区间'].value_counts()
mile1 = mile.index.tolist()         # 里程区间分类
mile2 = mile.tolist()               # 里程区间分类对应数量
print(mile1)
print(mile2)

41219ced31a51ba889be76c92659fe05.png

7406bba7a4ae6128f5587f471de6c415.gif

重置索引

其实我们在上面案例的演示中已经发现了,根据条件取出来的数据的索引都是处理数据之前的索引,

我们现在要重置索引的话要怎么办呢?

我们可是使用reset_index()来索引重置

重置索引前:

# 找出在 过户情况 中所有'0次'的汽车
cars = pd_data[pd_data['过户情况'].str.contains('0次')]
print(cars.reset_index())

db45b3e52b3d64c2809bfc50e5252743.png

重置索引后:

4b041c5d3ca2f4b9955b3773f4bc4ed3.png

很好,但是不完美。多了一列colm name叫做 index的先前序列号。

不想看到它,有办法吗?

drop = True

# 找出在 过户情况 中所有'0次'的汽车
cars = pd_data[pd_data['过户情况'].str.contains('0次')]
print(cars.reset_index(drop=True))

d0617533f1215357965ddc8e7120b0e3.png

3827f37f6c52506648d6e5a18fe1b9d7.png

column重命名

858b8126e78b54d0962a116a6c86136c.png

# 重命名
pd_data = pd_data.rename(columns = {'车辆概况':'车辆详情'})
print(pd_data)

0258aa7c44c9da7bea77e6c20b22b3e8.png

8e3893a3d71a67731568f246c9b78caf.png

分组统计groupby-单条件

# 统计不同变速箱总里程
pd_data.loc[:, '表显里程new'] = pd_data['表显里程'].str.replace('万公里', '').astype('float32')    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby('变速箱')['表显里程new'].sum()
print(trans_mile)

97421e4872875b8b0e50c7a12707657f.png

分组统计groupby-多条件

# 统计不同变速箱和过户情况总里程
pd_data.loc[:, '表显里程new'] = pd_data['表显里程'].str.replace('万公里', '').astype('float32')    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby(['变速箱','过户情况'])['表显里程new'].sum()
print(trans_mile)

76e21607ba258836f9b4d922195a19d4.png

如果再加上一个重置索引 trans_mile.reset_index()

f61b7a6119a91b61106998e56ba02c4f.png

d5f57bdfc4dd13eb4fc953f567f75cd1.gif

求平均

e8538e7da34294100260ed3ee329b8bb.gif
# 统计不同过户次数车辆平均里程
pd_data.loc[:, '表显里程new'] = pd_data['表显里程'].str.replace('万公里', '').astype('float32')    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby('过户情况')['表显里程new'].mean()
print(trans_mile.reset_index())

ab1d6c51161b36347c577dde29b0a068.png

2d6a5ff2730a831ca6268bc9d65cd3fa.gif

apply函数

还记得我们爬取大学的那个教程吗?

爬虫+数据可视化选大学,小学妹直呼牛X

我们爬出来的数据如果是985或者是211显示为1,

如果非985或者211,显示为2

0f0638dddde2860c7a7a916c59de62a3.png

现在我不想要1和2了,因为我看不懂它是什么意思?如果是985或者211,就显示是,如果不是,就显示否!

pd_data = pd.read_excel('./全国高校数据.xlsx')
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一个副本, 防止数据损坏
pd_data['f985'] = pd_data['f985'].apply(lambda x: '是' if x == 1 else '否')       # 通过匿名函数解决
pd_data['f211'] = pd_data['f985'].apply(lambda x: '是' if x == 1 else '否')       # 通过匿名函数解决
print(pd_data)

82404f11e6f0a974e49c11c59e588816.png

同理利用lambda函数我们还可以

给省份这一列后面加个''

pd_data = pd.read_excel('./全国高校数据.xlsx')
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一个副本, 防止数据损坏

pd_data['province_name'] = pd_data['province_name'].apply(lambda x: x+'省')       # 通过匿名函数解决
print(pd_data)
'''

cb4c6233ffa7a861b9df27d38a75870e.png

同理利用lambda函数我们还可以给

人气值view_total这一列最后面的'w'

pd_data['view_total'] = pd_data['view_total'].apply(lambda x: x[:-1])       # 通过匿名函数解决
print(pd_data)

f837d3fdaa1d8474cadd27ac66ceab92.png

4c77d86b2d14fce777e7dfbb73c14789.gif

求最大最小值

max_view_total = pd_data[pd_data['view_total'] == pd_data['view_total'].max()]
print(max_view_total)

bf63416c9221cf4e46b4648fc9b59fbd.png

min_view_total = pd_data[pd_data['view_total'] == pd_data['view_total'].min()]
print(min_view_total)

a03ead14c0ae8eb7b83704e0d9728540.png

39ee6cfdc702d9f528ebfdbacde8702a.gif

时间提取

d6195760f00a4035b3e53174b06b13a9.gif

为了便于演示,我加上了一列 Date 选项,如下:

f624081e03fb19b289a32af2941e6050.png

现在我们想提取其中的年份或者月份,我们可以使用 'DatetimeIndex'这个方法来实现。

pd_data = pd.read_excel('./全国高校数据.xlsx')
pd_data['year'] = pd.DatetimeIndex(pd_data['Date']).year
pd_data['month'] = pd.DatetimeIndex(pd_data['Date']).month
pd_data['day'] = pd.DatetimeIndex(pd_data['Date']).day
print(pd_data)

ff002fbcd146f05b1174123600debe7f.png

a828b6f65240dd803fde6015756b05d8.gif

增加列

我想把刚才的生成的年+月+日方法到前三列,可以使用insert()方法来实现

Year = pd.DatetimeIndex(pd_data['Date']).year
Month = pd.DatetimeIndex(pd_data['Date']).month
day = pd.DatetimeIndex(pd_data['Date']).day
pd_data.insert(0, 'Year', Year)
pd_data.insert(1, 'Month', Month)
pd_data.insert(2, 'day', day)
print(pd_data)

45ee254a0d4b1ec5eaba76249749cdec.png

d1cf7fcd96232fb50d4d5f233da5cb38.gif

点击下方卡片进行关注,获取更多内容

31f195c12b53d42013ed562ec940e009.png

点分享

d475830e887b2ef853326970c1b61956.png

点收藏

e7b75c2b6bcead11cfb1bef3f6378c0d.png

点点赞

a010642055cb3a69de477742e7c601b5.png

点在看

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值