Pandas_数据转换

删除重复值

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值