前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python pandas 基础之四---转换,排序,聚合

python pandas 基础之四---转换,排序,聚合

作者头像
小末快跑
发布2019-07-03 17:33:04
7910
发布2019-07-03 17:33:04
举报
文章被收录于专栏:日常撸知识

一、删除重复的元素

duplicated()函数可以检测重复的行,返回布尔型的Series对象,每个元素对应一行。

可以用该方法找出重复的行,frame[frame.duplicated()]

drop_duplicates()函数删除重复的行,返回删除重复行后的DataFrame()对象。

代码语言:javascript
复制
import pandas as pd
import numpy as np

frame1=pd.DataFrame({'color':['white','white','red','red','white'],'price':[2,1,3,3,2]})

frame2=frame1[frame1.duplicated()]

print(frame1)

print(frame1.duplicated())

print(frame2)

结果为:

代码语言:javascript
复制
   color  price
0  white      2
1  white      1
2    red      3
3    red      3
4  white      2
0    False
1    False
2    False
3     True
4     True
dtype: bool
   color  price
3    red      3
4  white      2

二、用映射替换元素

要用心元素替换不正确的元素,可以定义一组映射关系,旧元素作为键,新元素作为值。

代码语言:javascript
复制
frame1=pd.DataFrame({'color':['white','white','red','red','white'],'price':[2,1,3,3,2]})

newcolors={'red':'rosso','white':'verde'}

frame3=frame1.replace(newcolors)

print(frame3)

结果为:

代码语言:javascript
复制
   color  price
0  verde      2
1  verde      1
2  rosso      3
3  rosso      3
4  verde      2

replace()函数也可以用来直接替换元素:

代码语言:javascript
复制
frame1=pd.DataFrame({'color':['white','white','red','red','white'],'price':[2,np.nan,3,3,np.nan]})

frame4=frame1.replace(np.nan,12)

print(frame4)

结果为:

代码语言:javascript
复制
   color  price
0  white    2.0
1  white   12.0
2    red    3.0
3    red    3.0
4  white   12.0

同理,frame1.replace('white':'blue'),会将white替换为blue。

使用rename()函数重命名索引或者列名称:

代码语言:javascript
复制
frame1=pd.DataFrame({'color':['white','white','red','red','white'],'price':[2,78,3,3,23]})

newindex={0:'zero',1:'first',2:'second',3:'third',4:'four'}
newcolumns={'color':'Item','price':'value'}

frame1=frame1.rename(index=newindex,columns=newcolumns)

print(frame1)

结果为:

代码语言:javascript
复制
         Item  value
zero    white      2
first   white     78
second    red      3
third     red      3
four    white     23

rename()函数返回一个重命名index或者columns的新DataFrame对象,原对象仍保持不变,可以添加inpalce=True参数是原对象改变。

代码语言:javascript
复制
frame.rename(index=newindex,columns=newcolumns,inplace=True)

三、离散化和面元划分

一个列表储存了一系列数据,要将这些数据分为几个区间,或者分为几个列别;例如把数据取值范围分为几个区间,统计每个区间的个数。

使用cut()函数,将列表中的数据划分为几个区间,判断元素属于哪个区间内。

代码语言:javascript
复制
testresult=[12,34,67,55,23,56,78,90,42,25,79,99,89]

bins=[0,25,50,75,100]

cat=pd.cut(testresult,bins)

print(cat)

结果为:

代码语言:javascript
复制
[(0, 25], (25, 50], (50, 75], (50, 75], (0, 25], ..., (25, 50], (0, 25], (75, 100], (75, 100], (75, 100]]
Length: 13
Categories (4, interval[int64]): [(0, 25] < (25, 50] < (50, 75] < (75, 100]]

使用value_counts()统计每个面元出现的次数:

代码语言:javascript
复制
value_count=pd.value_counts(cat)

结果为:

代码语言:javascript
复制
(75, 100]    5
(50, 75]     3
(0, 25]      3
(25, 50]     2
dtype: int64

对每个区间分别加一个标签,例如:

代码语言:javascript
复制
testresult=[12,34,67,55,23,56,78,90,42,25,79,99,89]

bins=[0,25,50,75,100]

bin_names=['low','middle','good','best']

cat=pd.cut(testresult,bins,labels=bin_names)

print(cat)

结果为:

代码语言:javascript
复制
[low, middle, good, good, low, ..., middle, low, best, best, best]
Length: 13
Categories (4, object): [low < middle < good < best]

如果不指定面元的区间界限,只传入一个整数作为参数,cut()函数就会按照指定的数字将数组元素分成相应的几个部分。

qcut()函数,这个函数将样本划分为5个部分, qcut()函数保证每个面元的个体数相同,但是每个区间的大小不同。

四、排序

例如,先用permutation()函数创建一个包含随机整数的数组。在用这个数组元素对DataFrame()对象进行排序。

代码语言:javascript
复制
frame=pd.DataFrame(np.arange(25).reshape(5,5))

print(frame)

结果为:

代码语言:javascript
复制
    0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
4  20  21  22  23  24

对行重新排序:

代码语言:javascript
复制
neworder=np.random.permutation(5)

frame=frame.take(neworder)

print(neworder)
print(frame)

结果为:

代码语言:javascript
复制
[4 1 3 0 2]

    0   1   2   3   4
4  20  21  22  23  24
1   5   6   7   8   9
3  15  16  17  18  19
0   0   1   2   3   4
2  10  11  12  13  14

按照列元素里的值进行排序:

代码语言:javascript
复制
frame=pd.DataFrame(np.arange(25).reshape(5,5),columns=['a','b','c','c','d'])

frame=frame.sort_values(by=['b'],ascending=False)

print(frame)

结果将按照b列进行倒序排列:

代码语言:javascript
复制
    a   b   c   c   d
4  20  21  22  23  24
3  15  16  17  18  19
2  10  11  12  13  14
1   5   6   7   8   9
0   0   1   2   3   4

五、数据分类聚合

GroupBy三步骤: 分组--用函数处理--合并

分组:将数据集根据给定条件分成多个组

用函数处理:用函数处理每一组

合并:把不同组得到的结果合并起来

原数据:

代码语言:javascript
复制
frame=pd.DataFrame({'color':['white','red','green','red','green'],
                    'object':['pen','pencil','pencil','ashtray','pen'],
                    'price1':[2.3,3.4,4.5,5.6,6.7],
                    'price2':[1,3,5,7,9]})

print(frame)
代码语言:javascript
复制
   color   object  price1  price2
0  white      pen     2.3       1
1    red   pencil     3.4       3
2  green   pencil     4.5       5
3    red  ashtray     5.6       7
4  green      pen     6.7       9

使用groupby()

代码语言:javascript
复制
group=frame['price1'].groupby(frame['color'])

groupmean=group.mean()

groupsum=group.sum()

print(groupmean)
print('---------')
print(groupsum)

结果为:

代码语言:javascript
复制
color
green    5.6
red      4.5
white    2.3
Name: price1, dtype: float64
---------
color
green    11.2
red       9.0
white     2.3
Name: price1, dtype: float64

可以按多个级分组:

groupby([frame['color'],frame['object']])

代码语言:javascript
复制
group=frame['price1'].groupby([frame['color'],frame['object']])

groupmean=group.mean()
groupsum=group.sum()

print(groupmean)
print('---------')
print(groupsum)

结果为:

代码语言:javascript
复制
green  pen        6.7
       pencil     4.5
red    ashtray    5.6
       pencil     3.4
white  pen        2.3
Name: price1, dtype: float64
---------
color  object 
green  pen        6.7
       pencil     4.5
red    ashtray    5.6
       pencil     3.4
white  pen        2.3
Name: price1, dtype: float64

此外,还可以按照多列数据进行分组:

frame[['price1','price2']].groupby(frame['color'])

代码语言:javascript
复制
group=frame[['price2','price1']].groupby([frame['color'],frame['object']])

groupmean=group.mean()
groupsum=group.sum()

print(groupmean)
print('---------')
print(groupsum)

结果为:

代码语言:javascript
复制
               price2  price1
color object                 
green pen           9     6.7
      pencil        5     4.5
red   ashtray       7     5.6
      pencil        3     3.4
white pen           1     2.3
---------
               price2  price1
color object                 
green pen           9     6.7
      pencil        5     4.5
red   ashtray       7     5.6
      pencil        3     3.4
white pen           1     2.3

用groupby()操作时,在groupby的任何一个阶段都可以任意选择一列数据,下面几个操作等价:

frame['price1'].groupby(frame['color']).mean()

frame.groupby(frame['color'])['price'].mean()

(frame.groupby(frame['color']).mean()).['price']

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小末快跑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档