Pandas映射&分组聚合

Pandas映射&分组聚合


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']#设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
#import pymysql
import pandas as pd
from pandas import DataFrame,Series 
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df
012345
043175761455
1156383378537
2238451753428
371133155396
439201335333
df.replace(to_replace = 5,value = 'Five')
012345
04317576145Five
1156383378537
2238451753428
371133155396
439201335333
df.replace(to_replace = {5: 'Five'})
012345
04317576145Five
1156383378537
2238451753428
371133155396
439201335333
df.replace(to_replace={4:3},value='Three')
# 将指定列的元素进行替换to_replace={列索引:被替换的值}

012345
043175761455
1156383378537
2238451753428
371133155Three96
439201335333
# 映射的概念
"""
概念:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表现形式)

    创建一个df 两列分别为姓名和薪资,然后给其名字起对应的英文名
"""
dic = {
    'name':['张三','李四','张三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
df
namesalary
0张三15000
1李四20000
2张三15000
# 映射关系表
dic = {
    '张三':'tom',
    '李四':'jack'
}
df['e_name'] = df['name'].map(dic)
df
namesalarye_name
0张三15000tom
1李四20000jack
2张三15000tom
# 运算工具
# 超过 3000 部分的钱要缴纳50%的税

# 该函数是我们的指定的一个运算法则
def after_sal(s):
    return s-(s-3000)*0.5
df['after_sal'] = df['salary'].map(after_sal)
df
namesalarye_nameafter_sal
0张三15000tom9000.0
1李四20000jack11500.0
2张三15000tom9000.0
######### 排序实现的随机抽样
take()
np.random.permutation()
df = df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df
ABC
0506381
1239067
217247
3504263
4478769
............
95779864
96919087
97318143
98627185
99681155

100 rows × 3 columns

# 生成乱序的随机序列
np.random.permutation(10)

array([5, 3, 8, 1, 9, 6, 7, 0, 2, 4])
# 将原始数据打乱
df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)
CBA
0816350
1679023
247721
3634250
4698747
............
95649877
96879091
97438131
98857162
99551168

100 rows × 3 columns

df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50]
ABC
56805593
37464482
78324842
3504263
0506381
86539320
3661748
64526763
95779864
48556362
34369154
11133628
15611910
55991456
3313489
89287564
4338865
105153
7087641
9182324
28172746
2729352
1239067
82232874
12807780
8226998
65747590
74647520
1368442
66991596
45179372
4478769
766716
3893390
5443034
94492226
51234835
72863956
73283079
53239581
46374318
927333
40274870
16571785
29939095
5823714
91634730
57263598
21241073
4192156
分组聚合
# 数据的分类处理
 # 数据分类处理的核心
#   groupby()函数
#   groups属性查看分组情况

df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
                'color':['red','yellow','yellow','green','green','green'],
                'weight':[12,20,50,30,20,44]
    
})
df

itempricecolorweight
0Apple4.0red12
1Banana3.0yellow20
2Orange3.0yellow50
3Banana2.5green30
4Orange4.0green20
5Apple2.0green44
# 想要水果的种类进行分析
df.groupby(by='item')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000236FEE0E550>
# 查看详细的分组情况
df.groupby(by='item').groups
{'Apple': [0, 5], 'Banana': [1, 3], 'Orange': [2, 4]}
# 计算出每一种水果的平均价格
df.groupby(by='item')['price'].mean()
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64
# 计算每一种颜色对应水果的平均重量
df.groupby(by='color')['weight'].mean()
color
green     31.333333
red       12.000000
yellow    35.000000
Name: weight, dtype: float64
# 将计算结果汇总到原数据
dic = df.groupby(by='color')['weight'].mean().to_dict()

df['mean_w'] = df['color'].map(dic)

df

高级的数据聚合

1.使用groupby 分组后,也可以使用transform和apply提供自定义的函数实现更多的运算
2.df.groupby(‘item’)[‘price’].sum() <= => df.groupby(‘item’)[‘price’].apply(sum)
3.transform 和 apply 都会进行运算,在其中传入函数即可
4.transform 和 apply 也可以传入一个 lambda 表达式

def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum/len(s)
# df.groupby(by='item')['price'].mean()
df.groupby(by='item')['price'].transform(my_mean)  # 运算完成后自动完成了映射
0    3.00
1    2.75
2    3.50
3    2.75
4    3.50
5    3.00
Name: price, dtype: float64
df.groupby(by='item')['price'].apply(my_mean)
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值