【python数据分析(13)】Pandas中数据去重与替换、数据分组(groupby⽅
法。。。
1. 去重及替换
1.1 .duplicated()⽅法,判断是否重复
可以通过布尔判断,得到不重复的值(类⽐之前的.is_unique()⽅法)
s = pd.Series([1,1,1,2,2,3,4,5])
print(s.duplicated())
print(s[s.duplicated()==False])
–> 输出的结果为:
0False
1True
2True
3False
4True
5False
6False
7False
dtype:bool
01
32
53
64
75
dtype: int64
1.2 drop.duplicates()移除重复
★★★★★ inplace参数:是否替换原值,默认False(也就是不改变原来数据的值)
这⾥特别容易出错,有 两种⽅式 可以改变原来的数据,⼀种是通过inplace参数,还有⼀种是重新赋值(这⾥容易搞混)
s.drop_duplicates(inplace =True)
print(s)
s = s.drop_duplicates()
print(s)
–> 输出的结果为:(注意上⾯的操作,⼀个是赋值了,⼀个是没有赋值,在使⽤inplace=True时候,不⽤赋值)
01
32
53
64
75
dtype: int64
01
32
53
64
75
dtype: int64
Dataframe中使⽤duplicated(上⾯对于Series的操作都适⽤于DataFrame,因为⾥⾯的的任意⼀列单独拿出来都是⼀个Series)
df = pd.DataFrame({'key1':['a','a',3,4,5],
'key2':['a','a','b','b','c']})
print(df.duplicated())
print(df['key2'].duplicated())
print(df['key2'].drop_duplicates())
–> 输出的结果为:
0False
1True
2False
3False
4False
dtype:bool
0False
1True
2False
3True
4False
Name: key2, dtype:bool
0    a
2    b
4    c
Name: key2, dtype:object
★★★★★1.3 替换
.replace() ⽅法 在进⾏DataFrame数据微调的时候经常使⽤(可以和之前的删除数据del 列名进⾏类⽐)可⼀次性替换⼀个值或多个值,也可传⼊列表或字典
s = pd.Series(list('ascaazsd'))
place('a', np.nan))
place(['a','s'],np.nan))
place({'a':'hello world!','s':123}))
–> 输出的结果为:
0    NaN
1      s
2      c
3    NaN
4    NaN
5      z
6      s
7      d
dtype:object
0    NaN
1    NaN
2      c
3    NaN
4    NaN
5      z
6    NaN
7      d
dtype:object
0    hello world!
1123
2              c
3    hello world!
4    hello world!
5              z
6123
7              d
dtype:object
2. 数据分组
分组统计 - groupby功能
Dataframe在⾏(axis=0)或列(axis=1)上进⾏分组,将⼀个函数应⽤到各个分组并产⽣⼀个新值,然后函数执⾏结果被合并到最终的结果对象中。
2.1 groupby对象
1) 直接分组得到⼀个groupby对象(可迭代),是⼀个中间数据,没有进⾏计算
df = pd.DataFrame({'X':['A','B','A','B'],'Y':[1,4,3,2]})
print(df)
upby('X'))
print(upby('X'))
–> 输出的结果为:
X  Y
0  A  1
1  B  4
2  A  3
3  B  2
&ic.DataFrameGroupBy object at 0x10C1F890>
<ic.DataFrameGroupBy'>
2) 迭代的对象组成list列表就可以进⾏索引、也可以对列表进⾏遍历循环输出
print(upby('X')))
print(upby('X'))[0])
for n,g upby('X'):
print(n)
print(g)
print('——————')
–> 输出的结果为:(从结果可以看出,迭代器⾥⾯的元素是以元祖的⽅式存放的,第⼀个是组名(分组后的标签名),第⼆个就是组内的数据DataFrame)
[('A',    X  Y
0  A  1
2  A  3),('B',    X  Y
1  B  4
3  B  2)]
('A',    X  Y
0  A  1
2  A  3)
A
X  Y
0  A  1
2  A  3
——————
B
X  Y
1  B  4
3  B  2
——————
3) .get_group() 提取分组后的组内数据DataFrame
upby(['X']).get_group('A'),'\n')
upby(['X']).get_group('B'),'\n')
–> 输出的结果为:
X  Y
0  A  1
2  A  3
X  Y
1  B  4
3  B  2
4) .groups:将分组后的groups转为dict,可以字典索引⽅法来查看groups⾥的元素
grouped = df.groupby(['X'])
ups)
ups['A'])
ups['A'].values)
–> 输出的结果为:(注意这⾥存在着pandas的版本问题,只是数据显⽰的问题,可以通过.values⽅式转换)
#⽼版本会输出下⾯内容
{'B':[1,3],'A':[0,2]}
[0,2]
#新版本会输出下⾯内容(pandas版本1.0.1)
{'A': Int64Index([0,2], dtype='int64'),'B': Int64Index([1,3], dtype='int64')}
Int64Index([0,2], dtype='int64')
#添加.values的⽅式就可以获得和原来⼀样的数据类型
[02]
groupby分组
5) .size():查看分组后的长度
sz = grouped.size()
print(sz,type(sz))
–> 输出的结果为:(这⼀步的输出是基于上⼀步分组后的结果)
X
A    2
B    2
dtype: int64 <series.Series'>
2.2 按照多列进⾏分组
df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
'B':['one','one','two','three','two','two','one','three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
grouped = df.groupby(['A','B']).groups
print(df)
print(grouped)
print(grouped[('foo','three')])
–> 输出的结果为:
A      B        C        D
0  foo    one -0.6686950.247781
1  bar    one -0.1253742.259134
2  foo    two -0.1120521.618603
3  bar  three -0.0989860.150488
4  foo    two  0.912286-1.260029
5  bar    two  1.096757-0.571223
6  foo    one -0.090907-1.671482
7  foo  three  0.088176-0.292702
#⽼版本输出结果
{('bar','two'):[5],('foo','two'):[2,4],('bar','one'):[1],('foo','three'):[7],('bar','three'):[3],('foo','one'):[0,6]}
[7]
#新版本输出如下
{('bar','one'): Int64Index([1], dtype='int64'),('bar','three'): Int64Index([3], dtype='int64'),('bar','two'): Int64Index([5], dtype='int64'),('foo','one'): Int64Index ([0,6], dtype='int64'),('foo','three'): Int64Index([7], dtype='int64'),('foo','two'): Int64Index([2,4], dtype='int64')}
Int64Index([7], dtype='int64')
2.3 按照值类型分列
其他轴上的分组 ,通过改变axis的参数完成

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。