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

一、删除重复的元素

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

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

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

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)

结果为:

   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

二、用映射替换元素

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

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)

结果为:

   color  price
0  verde      2
1  verde      1
2  rosso      3
3  rosso      3
4  verde      2

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

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)

结果为:

   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()函数重命名索引或者列名称:

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)

结果为:

         Item  value
zero    white      2
first   white     78
second    red      3
third     red      3
four    white     23

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

frame.rename(index=newindex,columns=newcolumns,inplace=True)

三、离散化和面元划分

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

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

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)

结果为:

[(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()统计每个面元出现的次数:

value_count=pd.value_counts(cat)

结果为:

(75, 100]    5
(50, 75]     3
(0, 25]      3
(25, 50]     2
dtype: int64

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

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)

结果为:

[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()对象进行排序。

frame=pd.DataFrame(np.arange(25).reshape(5,5))

print(frame)

结果为:

    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

对行重新排序:

neworder=np.random.permutation(5)

frame=frame.take(neworder)

print(neworder)
print(frame)

结果为:

[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

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

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列进行倒序排列:

    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三步骤: 分组--用函数处理--合并

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

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

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

原数据:

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)
   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()

group=frame['price1'].groupby(frame['color'])

groupmean=group.mean()

groupsum=group.sum()

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

结果为:

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']])

group=frame['price1'].groupby([frame['color'],frame['object']])

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

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

结果为:

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'])

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

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

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

结果为:

               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']

原文发布于微信公众号 - 小末快跑(Faster_Future)

原文发表时间:2019-02-18

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券