Pandas的数据处理

常见的聚合方法及说明

count—————–计数
describe————-给出各列的常用统计量
min,max————-最大最小值
argmin,argmax—-最大最小值的索引位置(整数)
idxmin,idxmax—–最大最小值的索引值
quantile————-计算样本分位数
sum,mean———-对列求和,均值
mediam————-中位数
mad——————根据平均值计算平均绝对离差
var,std—————方差,标准差
skew—————–偏度(三阶矩)
Kurt——————峰度(四阶矩)
cumsum————累积和
Cummins,cummax—累计组大致和累计最小值
cumprod————累计积
diff——————-一阶差分
pct_change———计算百分数变化

1.删除重复元素

使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True。
导入相应的包:

import pandas as pd
import numpy as np
from pandas import DataFrame, Series
df = DataFrame(np.random.randint(98, 100, size=(6, 3)),
               columns=["语文", "数学", "英语"],
               index=["张三", "李四", "王五", "张三", "小李", "小赵"])
print(df)
print(df.duplicated())   # 使用duplicated()检测重复的行

输出结果如下:

# df的输出结果
     语文  数学  英语
张三  99    99  98
李四  99    99  98
王五  98    98  99
张三  98    98  98
小李  99    98  99
小赵  98    99  99
# 使用duplicated()检测重复的行
张三     False
李四     True
王五     False
张三     False
小李     False
小赵     False
dtype: bool

在对行进行检测后,使用drop_duplicates()函数删除重复的行。

print(df.drop_duplicates())  # 使用drop_duplicates()函数删除重复的行  

输出结果为:

     语文  数学  英语
张三  99    99   98
王五  98    98   99
张三  98    98   98
小李  99    98   99
小赵  98    99   99
# 如果使用pd.concat([df1,df2],axis=1)生成新的DataFrame,新的df中的columns相同,使用duplicated()和drop_duplicates()都会出问题。
df1 = pd.concat([df, df], axis=1)
print(df1)
     语文  数学  英语  语文  数学  英语
张三  99    99   98    99    99   98
李四  99    99   98    99    99   98
王五  98    98   99    98    98   99
张三  98    98   98    98    98   98
小李  99    98   99    99    98   99
小赵  98    99   99    98    99   99

删除重复的列名

print(df1.drop_duplicates())   #重复的列名

输出结果为:

     语文  数学  英语  语文  数学  英语
张三  99    99   98    99    99   98
王五  98    98   99    98    98   99
张三  98    98   98    98    98   98
小李  99    98   99    99    98   99
小赵  98    99   99    98    99   99

2.映射

映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定,需要使用字典:map = {‘label1’:’value1’, ‘label2’:’value2’, … }。
其中包含三种操作:
(1)replace()函数:替换元素;该方法最为重要;
(2)map()函数:新建一列;
(3)rename()函数:替换索引。

replace()替换元素

replace({索引键值对})

df = DataFrame({
  'item': ['ball', 'mug', 'pen'],
                 'color': ['white', 'red', 'verde'],
                'price': [5.56, 4.20, 1.30]})
new_colors = {
  'red': 'black', 'verde': 'green'}
print(df)
print(df.replace(new_colors))

输出结果为:

   color  item  price
0  white  ball   5.56
1    red   mug   4.20
2  verde   pen   1.30

   color  item  price
0  white  ball   5.56
1  black   mug   4.20
2  green   pen   1.30

replace()还经常用来替换NaN元素

df = DataFrame({
  'math': [100, 139, np.nan], 'English': [146, None, 119]}, index=['张三', '李四', '王五'])
new_values = {np.nan: 100}
print(df)
print(df.replace(new_values))

输出结果为:

       English   math
张三    146.0    100.0
李四      NaN    139.0
王五    119.0     NaN

       English   math
张三    146.0    100.0
李四    100.0    139.0
王五    119.0    100.0
map()函数:新建一列

map(函数,可迭代对象) ,map(函数/{索引键值对})。map中返回的数据是一个具体值,不能迭代。

df = DataFrame({
  'color': ['red', 'green', 'blue'], 'project': ['Math', 'English', 'Chemistry']})
price = {
  'red': 5.56, 'green': 3.14, 'chemistry': 2.79}
print(df)
df5['price'] = df5['color'].map(price)
print(df)

输出结果为:

    color    project
0    red       Math
1  green    English
2   blue  Chemistry

    color    project  price
0    red       Math   5.56
1  green    English   3.14
2   blue  Chemistry    NaN
rename()函数:替换索引

rename({索引键值对})

df = DataFrame({
  'color': ['white', 'gray', 'purple', 'blue', 'green'], 'value': np.random.randint(0, 10, size=5)})
print(df)

输出结果为:

    color    value
0   white      5
1    gray      5
2  purple      7
3    blue      8
4   green      9

使用rename()函数替换行索引

new_index = {
  0: 'first', 1: 'two', 2: 'three', 3: 'four', 4: 'five'}
print(df.rename(new_index))

输出结果为:

         color   value
first   white      5
two      gray      5
three  purple      7
four     blue      8
five    green      9

3.异常值检查和过滤

df = DataFrame(np.random.randint(0, 150, size=(6, 3)), index=list("ABCDEF"), columns=list("语数英"))

输出结果为:

   语   数   英
A  115  13   22
B   38  96   89
C   11  25  128
D   42  15   37
E   51  66   67
F   52  67  146

1.使用describe()函数查看每一列的描述性统计量

print(df.describe())

输出结果为:

           语          数           英
count    6.000000   6.000000    6.000000
mean    51.500000  47.000000   81.500000
std     34.483329  34.135026   49.212803
min     11.000000  13.000000   22.000000
25% 39.000000 17.500000 44.500000
50% 46.500000 45.500000 78.000000
75% 51.750000 66.750000 118.250000
max    115.000000  96.000000  146.000000

2 .使用std()函数可以求得DataFrame对象每一列的标准方差

print(df.std())

输出结果为:

34.48332934.13502649.212803
dtype: float64

3.根据每一列的标准差,对DataFrame元素进行过滤。借助any()函数,测试是否有True,有一个或以上返回True,反之返回False。对每一列应用筛选条件,any过滤出所有符合条件的数据。

# 如果数据小于4倍的平均方差,认为数据可靠
df_df = np.abs(df8) < df8.std()*4
print(df_df.all(axis=1))
print(df8[df_df.all(axis=1)])

输出结果为:

A    True
B    True
C    True
D    True
E    True
F    True
dtype: bool

   语   数    英
A  115  13   22
B   38  96   89
C   11  25  128
D   42  15   37
E   51  66   67
F   52  67  146

4.排序

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

df = DataFrame(np.arange(25).reshape(5, 5))
new_order = np.random.permutation(5)  # 生成五个随机数
print(df)
print(new_order)
print(df.take(new_order))   # 根据new_order的随机数进行排序

输出结果为:

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
[1 2 4 0 3]  # print(new_order)
    0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
4  20  21  22  23  24
0   0   1   2   3   4
3  15  16  17  18  19
全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
关于我大学本科四年,想了很多,但还是不知道该怎么动笔&nbsp;“大学四年,是我从懵懂少年走向职场青年的转折期。这一路跌跌撞撞,有迷茫,有遗憾,也有成长和决心。”&nbsp;大一刚进来时仍然有高中那股学习劲,经常一个人去图书馆学高等数学,但后面劲头一过便开始在宿舍开启躺平生活(现在想想那段时间真的很爽,无忧无虑)。由于大一担任班干部,所以经常要跟其他班的班干部交流,在此期间认识了隔壁班的一位女生,短发而很可爱,因为很多团建还有比赛都是我们两班一起参加的,而且我和她都是负责人,所以交集很多,后面慢慢地彼此对产生了好感,所以在大一刚开学的2个月后,我们在一起了,彼此之前都是初恋。但当时我真的是太太太直男了,对感情的想...
真烦好烦真烦:骗哥们可以,别把你自己也骗到了就行。哥们被你骗了真无所谓的,打个哈哈就过了。但希望你打完这段话后擦一下眼角,别让眼泪掉在手机屏幕上了就行。你说的这些话,哥们信一下也是没什么的。还能让你有个心里安慰,但这种话说出来骗骗兄弟就差不多得了,哥们信你一下也不会少块肉,但是你别搞得自己也当真了就行。哥们被你骗一下是真无所谓的,兄弟笑笑也就过去了。真不是哥们想要破你防,你擦擦眼泪好好想想,除了兄弟谁还会信你这些话?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务