pandas---删除重复行、映射、异常值检测与过滤、抽样

1. 删除重复行

使用duplicated()函数检测重复的行。

返回布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True。

def make_df(indexs, columns):    
    data = [[str(j)+str(i) for j in columns] for i in indexs]
    df = pd.DataFrame(data=data, index=indexs, columns=columns)
    return df
df = make_df([1, 2, 3, 4], list('ABCD'))
df

# 让第一行和第二行重复
df.loc[1] = df.loc[2]
df

# 判断是否和前面的行重复了
df.duplicated()
df.duplicated(keep='first')  # 保留第一行
df.duplicated(keep='last')  # 保留最后一行
df.duplicated(keep=False)  # 标记所有重复行,不保留任何一行

pandas---删除重复行、映射、异常值检测与过滤、抽样_第1张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第2张图片

df.loc[1, 'D'] = 'DDD'
df

# subset: 子集
df.duplicated(subset=['A','B','C'])

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第3张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第4张图片

 使用drop_duplicates()函数删除重复的行:

print(df.drop_duplicates())
df.drop_duplicates(subset=['A', 'B', 'C'])
df.drop_duplicates(subset=['A', 'B', 'C'], keep='last')

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第5张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第6张图片

2. 映射

映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定。

replace()函数:替换元素

index = ['张三', '张三丰', '李白', '杜甫']
columns = ['Python', 'Java', 'H5', "UI"]
data = np.random.randint(0, 100, size=(4, 4))
df = pd.DataFrame(data=data, index=index, columns=columns)
df

# 替换元素
df.replace({5: 50, 1: 100})

pandas---删除重复行、映射、异常值检测与过滤、抽样_第7张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第8张图片

map()函数:新建一列,map()函数中可以使用lambda函数,适合处理某一单独的列

df2 = df.copy()
df2

# map一般用在Series数据结构,不能用于DataFrame
# df2['Python'].map({16: 160, 12: 120, 17: 170, 60:600})
# 将Python的每个人的成绩乘以10
df2['Python'].map(lambda x : x * 10)
# 新增一列
df2['Pandas'] = df2['Python'].map(lambda x : x * 10)
df2

pandas---删除重复行、映射、异常值检测与过滤、抽样_第9张图片 pandas---删除重复行、映射、异常值检测与过滤、抽样_第10张图片

# 新增一列:判断Java的成绩是否及格
df2['Java是否及格'] = df2['Java'].map(lambda n: '及格'  if n>=60 else '不及格')
df2

# 使用普通函数
# 新增一列: 判断UI成绩
#  <60  不及格
#  60<=n <80 及格
#  >=80 优秀
def fn(n):
    if n < 60:
        return '不及格'
    elif n < 80:
        return '及格'
    return '优秀'
df2['UI等级'] = df2['UI'].map(fn)
df2

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第11张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第12张图片

rename()函数:替换索引。

df3.rename({'张三': 'Mr Zhang'})  # 默认修改行索引名
df3.rename({'Python': '派森'}, axis=1)  # 修改列索引名
df3.rename(index={'张三': 'Mr Zhang'}) # 修改行索引名
df3.rename(columns={'Python': '派森'}) # 修改列索引名

# 重置索引
df3.reset_index()

# 设置行索引
df3.set_index(keys=['H5'])

pandas---删除重复行、映射、异常值检测与过滤、抽样_第13张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第14张图片

apply()函数:既支持 Series,也支持 DataFrame

df = pd.DataFrame(data=np.random.randint(0, 10, size=(5, 3)),
                              index=list('ABCDE'),
                              columns=['Python', 'NumPy', 'Pandas']
                 )
df
# 用于Series, 其中x表式的Series中元素
df['Python'].apply(lambda x:  True if x>5 else False)
# 用于DataFrame, 其中x是DataFrame中某列或某行的Series数据
df.apply(lambda x : x.mean(), axis=0)  # 求每一列数据的平均值
df.apply(lambda x : x.mean(), axis=1)  # 求每一行数据的平均值

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第15张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第16张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第17张图片

# 自定义方法
def fn2(x):
    return  (np.round(x.mean(), 1), x.count())  # 平均值,计数
df.apply(fn2, axis=1)

# applymap: DataFrame专有的方法,其中的x是每个元素
df.applymap(lambda x : x + 100) 

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第18张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第19张图片

transform()函数

df = pd.DataFrame(data=np.random.randint(0, 10, size=(5, 3)),
                              index=list('ABCDE'),
                              columns=['Python', 'NumPy', 'Pandas']
                 )
df
# Series中使用transform
# 可以执行多项计算
df['Python'].transform([np.sqrt, np.exp])

# DataFrame中使用transform
def convert(x):
    if x.mean() > 5:
        return x * 10
    return x * (-10)   
df.transform(convert)  # 处理每一列
df.transform(convert, axis=1)  # 处理每一行

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第20张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第21张图片

3. 异常值检测和过滤 

describe():查看每一列的描述性统计量

df.std():可以求得DataFrame对象每一列的标准差

df.drop():删除特定索引

unique():唯一,去重,DataFrame没有unique,Series调用unique。

df.query:按条件查询

df2.drop('A')  # 默认删除行
df2.drop('Python', axis=1)  # 删除列
df2.drop(index='A')  # 删除行
df2.drop(columns='Python')  # 删除列
# 删除多列或多行
df2.drop(columns=['NumPy', 'Python'])
df2.drop(index=['A', 'B'], inplace=True)

df['Python'].unique()
# ==, >, <
# and, &
#  or , | 
# in 
df.query('Python == 9')  # 找到Python列中等于9的所有行
df.query('Python < 8') 
df.query('Python>6 and NumPy==2')
df.query('Python>6 & NumPy==2')
df.query('Python==3 or NumPy==2')
df.query('Python==3 | NumPy==2')
df.query('Python in [3, 4, 5, 6]')  # 成员运算符
# 使用变量
n = 7
df.query('Python == @n')  # @n 表式使用变量n的值
m =  [3, 4, 5, 6]
df.query('Python in @m')  # 成员运算符

df.sort_values(): 根据值排序;

df.sort_index(): 根据索引排序。

#  sort_values : 默认按照列名排序,默认升序  (常用)
df.sort_values('Python')  
# ascending: 是否升序,默认是True
df.sort_values('Python', ascending=False)  # 降序

# 根据行索引名排序,会把列进行排序(不常用)
df.sort_values('B', axis=1)
# 按照索引名排序 (不常用)
# 默认是对行索引进行排序,默认是升序
df.sort_index(ascending=False)
# 按照列索引排序
df.sort_index(ascending=False, axis=1)

pandas---删除重复行、映射、异常值检测与过滤、抽样_第22张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第23张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第24张图片

df.info(): 查看数据信息

df.info()

pandas---删除重复行、映射、异常值检测与过滤、抽样_第25张图片

4. 抽样 

使用.take()函数排序;可以借助np.random.permutation()函数随机排序。

df2.take([1, 0, 2])  # 行排列
df2.take([1, 0, 2], axis=1)  # 列排列

# 随机排列
np.random.permutation([0, 1, 2])

# 无放回抽样: 依次随机取出,没有重复值
df2.take(np.random.permutation([0, 1, 2]))

 pandas---删除重复行、映射、异常值检测与过滤、抽样_第26张图片pandas---删除重复行、映射、异常值检测与过滤、抽样_第27张图片

# 有放回抽样: 可能会出现重复值

np.random.randint(0, 3, size=5)

df2.take(np.random.randint(0, 3, size=5))

pandas---删除重复行、映射、异常值检测与过滤、抽样_第28张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(pandas,pandas,python,数学建模)