删除重复值
frame=pd.DataFrame({'k1':['one','two']*3+['two'],
'k2':[1,1,2,3,3,4,4]})
frame.duplicated() #判断重复行
'''
参数:
subset:指定一列或多列进行比较,默认None所有列
keep:‘first’默认,‘last’,保留第一个匹配到的或最后一匹配到的
'''
frame.drop_duplicates() #删除重复的数据
'''
参数:
subset:指定一列或多列进行比较,默认None所有列
keep:‘first’默认,‘last’,保留第一个匹配到的或最后一匹配到的
inplace 是否在原对象上进行操作,默认False
'''
映射增加列
frame=pd.DataFrame({'name':['小明','小花','小白','小丽','小王',],
'sex':['男','女','女','女','男']})
name_to_classroom={
'小明':'一班',
'小花':'一班',
'小白':'二班',
'小丽':'一班',
'小王':'二班',
}
frame['name_to_classroom']=frame['name'].map(name_to_classroom)
print(frame)
'''
name sex name_to_classroom
0 小明 男 一班
1 小花 女 一班
2 小白 女 二班
3 小丽 女 一班
4 小王 男 二班
'''
替换值
frame=pd.DataFrame(np.random.randint(1,5,size=12).reshape(3,4))
print(frame)
'''
0 1 2 3
0 1 4 2 3
1 1 3 4 2
2 2 1 2 4
'''
print(frame.replace(1,np.NAN))
'''
0 1 2 3
0 NaN 4.0 2 3
1 NaN 3.0 4 2
2 2.0 NaN 2 4
'''
print(frame.replace([1,2],np.NAN))#将列表里的每个元素转为NAN
print(frame.replace({1:'a',2:'b'}))#将字典里的key转为对应的value
参数:inplace,不再解释了
where(cond, other=nan, inplace=False, axis=None, level=None, errors=‘raise’, try_cast=False, raise_on_error=None)
'''
cond:条件
other:默认为nan,cond 为真,保持原来的值,否则替换为other
inplace:在原数据集上操作
'''
frame=pd.DataFrame(np.random.randint(1,5,size=12).reshape(3,4),columns=list('abcd'))
print(frame)
'''
a b c d
0 2 3 3 1
1 3 3 2 1
2 4 3 1 3
'''
result=frame.where(frame<3,5)
print(result)
'''
a b c d
0 2 5 5 1
1 5 5 2 1
2 5 5 1 5
'''
mask 函数和 where 作用相反
分箱
'''
cuts.cut()
参数:
x:数据源
bins:自定义的组分,如果传入一个int,那么会切成int等分
labels:自定义箱名,默认None,指定为False,则生成普通索引(0,1,2....)
precision:定义保留几位小数点
'''
A=[1,2,5,23,57,83,4,67,45,60]
B=[0,30,60,90] #定义组分,含尾不含头
cuts=pd.cut(A,bins=B)
'''
[(0, 30], (0, 30], (0, 30], (0, 30], (30, 60], (60, 90], (0, 30], (60, 90], (30, 60], (30, 60]]
Categories (3, interval[int64]): [(0, 30] < (30, 60] < (60, 90]]
'''
cuts.codes
'''
分箱后每组数据对应的箱子下标
[0 0 0 0 1 2 0 2 1 1]
'''
pd.value_counts(cuts)
'''
统计箱数量
(0, 30] 5
(30, 60] 3
(60, 90] 2
'''
---------------------------------------------------------------------------------
等距分箱:qcut(),根据分位数进行分箱
'''
qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
x:数据源
q:int or list,等分分组或自定义的分位数(0-1)
'''
A=[1,2,5,23,57,83,4,67,45,60,34,36]
B=[0,30,60,90] #定义组分,含尾不含头
cuts=pd.qcut(A,4)
print(cuts)
print(pd.value_counts(cuts))
'''
[(0.999, 4.75], (0.999, 4.75], (4.75, 35.0], (4.75, 35.0], (35.0, 57.75], ..., (57.75, 83.0], (35.0, 57.75], (57.75, 83.0], (4.75, 35.0], (35.0, 57.75]]
(57.75, 83.0] 3
(35.0, 57.75] 3
(4.75, 35.0] 3
(0.999, 4.75] 3
'''
检测和过滤异常值
frame=pd.DataFrame(np.random.randn(100,4))
1.选出值大于2或值小于-2的所有行
frame[(abs(frame)>2).any(1)]
2.按值得正负生成1与-1
np.sign(frame)
随机取样
frame=pd.DataFrame([[1,2,3,4],[5,6,7,8],[5,6,7,8],[5,6,7,8]])
#想保留的行数
sampler=np.random.permutation(3)
frame.take(sampler)
print(frame.sample(n=6,replace=True))
n:行数
replace:允许重复,默认False
'''
0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 5 6 7 8
0 1 2 3 4
3 5 6 7 8
3 5 6 7 8
'''
虚拟变量
'''
如果DataFrame中一列‘key’有不同的值,那么可以衍生key列值为1和0的DataFrame或矩阵
'''
frame=pd.DataFrame({
'key':list('abcdabc'),
'value':range(7)
})
print(pd.get_dummies(frame['key']))
'''
a b c d
0 1 0 0 0 #key的index为0时,对应的值是a,所以(0,a)处为1
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
4 1 0 0 0
5 0 1 0 0
6 0 0 1 0
'''
'''
合并
'''
frame=pd.DataFrame({
'key':list('abcdabc'),
'value':range(7)
})
#prefix:前缀
dummy=pd.get_dummies(frame['key'],prefix='key')
fr_to_dummy=frame[['value']].join(dummy)
print(fr_to_dummy)
'''
value key_a key_b key_c key_d
0 0 1 0 0 0
1 1 0 1 0 0
2 2 0 0 1 0
3 3 0 0 0 1
4 4 1 0 0 0
5 5 0 1 0 0
6 6 0 0 1 0
'''
'''
与分箱结合
'''
A=[1,2,5,23,57,83,4,67,45,60]
B=[0,30,60,90] #定义组分,含尾不含头
cuts=pd.cut(A,bins=B)
dummy=pd.get_dummies(cuts)
print(dummy)
'''
(0, 30] (30, 60] (60, 90]
0 1 0 0
1 1 0 0
2 1 0 0
3 1 0 0
4 0 1 0
5 0 0 1
6 1 0 0
7 0 0 1
8 0 1 0
9 0 1 0
'''