一、删除重复的元素
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']