Pandas---6.数据清洗
一、移除重复数据
1.Series/DataFrame.duplicated
1 | Series / DataFrame.duplicated( * args, * * kwargs) |
返回一个布尔Series
,指示调用者中,哪些行是重复的(重复行标记为True
)。
参数:
-
keep
:一个字符串或者False
,指示如何标记。它代替了废弃的参数take_last
'first'
:对于重复数据,第一次出现时标记为False
,后面出现时标记为True
'last'
:对于重复数据,最后一次出现时标记为False
,前面出现时标记为True
False
:对于重复数据,所有出现的地方都标记为True
2.Series/DataFrame.drop_duplicates
1 | Series / DataFrame.drop_duplicates( * args, * * kwargs) |
返回重复行被移除之后的Series/DataFrame
。
参数:
-
keep
:一个字符串或者False
,指示如何删除。 它代替了废弃的参数take_last
'first'
:对于重复数据,保留第一次出现,后面出现时删除'last'
:对于重复数据,最后一次出现时保留,前面出现时删除False
:对于重复数据,删除所有出现的位置
-
inplace
:一个布尔值。如果为True
,则原地修改。否则返回新建的对象。
对于DataFrame
,还有个 subset
参数。它是column label
或者其列表,给出了考虑哪些列的重复值。默认考虑所有列。(即一行中哪些字段需要被考虑)
二、apply
1.DataFrame.apply
有时,你希望将函数应用到由各列或者各行形成的一维数组上,此时DataFrame
的.apply()
方法即可实现此功能。
1 | DataFrame. apply (func, axis = 0 , broadcast = False , raw = False , reduce = None , args = (), * * kwds) |
参数:
func
:一个可调用对象,它会应用于每一行或者每一列axis
:指定应用于行还是列。如果为0/'index'
,则沿着0轴计算(应用于每一列);如果为1/'columns'
,则沿着1轴计算(应用于每一行)。broadcast
:一个布尔值,如果为True
,则结果为DataFrame
(不足的部分通过广播来填充)raw
:一个布尔值。如果为False
,则转换每一行/每一列为一个Series
,然后传给func
作为参数。如果True
,则func
接受到的是ndarray
,而不是Series
reduce
:一个布尔值。用于判断当DataFrame
为空时,应该返回一个Series
还是返回一个DataFrame
。如果为True
,则结果为Series
;如果为False
,则结果为DataFrame
。args
:传递给func
的额外的位置参数(第一个位置参数始终为Series/ndarray
)
2.DataFrame.applymap
3.Series.apply
Series
的.apply()
方法应用到Series
的每个元素上
1 | Series. apply (func, convert_dtype = True , args = (), * * kwds) |
参数:
func
:一个可调用对象,它会应用于每个元素convert_dtype
:一个布尔值。如果为True
,则pandas
会自动匹配func
结果的最佳dtype
;如果为False
,则dtype=object
args
:传递给func
的额外的位置参数。kwds
:传递给func
的额外的关键字参数。
返回结果可能是Series
,也可能是DataFrame
(比如,func
返回一个Series
)
4.Series.apply
Series
的.map(arg,na_action=None)
方法会应用到Series
的每个元素上
1 | Series. map (arg,na_action = None ) |
参数:
arg
:一个函数、字典或者Series
。如果为字典或者Series
,则它是一种映射关系,键/index label
就是自变量,值就是返回值。na_action
:如果为ignore
,则忽略NaN
三、缺失数据
pands
对象上的所有描述统计都排除了缺失数据。
1.DataFrame.dropna
根据各label
的值中是否存在缺失数据来对轴label
进行过滤。
1 | DataFrame.dropna(axis = 0 , how = 'any' , thresh = None , subset = None , inplace = False ) |
参数:
axis
:指定沿着哪个轴进行过滤。如果为0/'index'
,则沿着0轴;如果为1/'columns'
,则沿着1轴。你也可以同时提供两个轴(以列表或者元组的形式)how
:指定过滤方式。如果为'any'
,则如果该label
对应的数据中只要有任何NaN
,则抛弃该label
;如果为'all'
,则如果该label
对应的数据中必须全部为NaN
才抛弃该label
。thresh
:一个整数,要求该label
必须有thresh
个非NaN
才保留下来。它比how
的优先级较高。subset
:一个label
的array-like
。比如axis=0
,则subset
为轴 1 上的标签,它指定你考虑哪些列的子集上的NaN
inplace
:一个布尔值。如果为True
,则原地修改。否则返回一个新创建的DataFrame
对于Series
,其签名为: Series.dropna(axis=0, inplace=False, **kwargs)
2.DataFrame/Series.fillna
用指定值或者插值方法来填充缺失数据。
1 | DataFrame / Series.fillna(value = None , method = None , axis = None , inplace = False , limit = None , downcast = None , * * kwargs) |
参数:
-
value
:一个标量、字典、Series
或者DataFrame
。注意:value
与method
只能指定其中之一,不能同时提供。- 如果为标量,则它指定了填充
NaN
的数据。 - 如果为
Series/dict
,则它指定了填充每个index
的数据 - 如果为
DataFrame
,则它指定了填充每个DataFrame
单元的数据
- 如果为标量,则它指定了填充
-
method
:指定填充方式。可以为None
,也可以为:'backfill'/'bfill'
:使用下一个可用的有效值来填充(后向填充)'ffill'/'pad'
:使用前一个可用的有效值来填充(前向填充)
-
axis
:指定沿着哪个轴进行填充。如果为0/'index'
,则沿着0轴;如果为1/'columns'
,则沿着1轴 -
inplace
:一个布尔值。如果为True
,则原地修改。否则返回一个新创建的DataFrame
-
limit
:一个整数。如果method
提供了,则当有连续的N
个NaN
时,只有其中的limit
个NaN
会被填充(注意:对于前向填充和后向填充,剩余的空缺的位置不同) -
downcast
:一个字典,用于类型转换。字典形式为:{label->dtype}
,dtype
可以为字符串,也可以为np.float64
等。
3.DataFrame/Series.isnull/notnull
DataFrame/Series.isnull()
:返回一个同样尺寸的布尔类型的对象,来指示每个值是否是null
DataFrame/Series.notnull()
:返回一个同样尺寸的布尔类型的对象,来指示每个值是否是not null
4.DataFrame/Series.replace
fillna()
方法可以看作是值替换的一种特殊情况。更通用的是值替换replace()
方法。
1 2 | Series / DataFrame.replace(to_replace = None , value = None , inplace = False , limit = None , regex = False , method = 'pad' , axis = None ) |
参数:
-
to_replace
:一个字符串、正则表达式、列表、字典、Series
、数值、None
。指示了需要被替换的那些值-
字符串:则只有严格等于该字符串的那些值才被替换
-
正则表达式:只有匹配该正则表达式的那些值才被替换(
regex=True
) -
列表:
- 如果
to_place
和value
都是列表,则它们必须长度严格相等 - 如果
regex=True
,则列表中所有字符串都是正则表达式。
- 如果
-
字典:字典的键对应了被替换的值,字典的值给出了替换值。如果是嵌套字典,则最外层的键给出了
column
名 -
None
:此时regex
必须是个字符串,该字符串可以表示正则表达式、列表、字典、ndarray
等。如果value
也是None
,则to_replace
必须是个嵌套字典。
-
-
value
:一个字符串、正则表达式、列表、字典、Series
、数值、None
。给出了替换值。如果是个字典,则键指出了将填充哪些列(不在其中的那些列将不被填充) -
inplace
:一个布尔值。如果为True
,则原地修改。否则创建新对象。 -
limit
:一个整数,指定了连续填充的最大跨度。 -
regex
:一个布尔值,或者与to_replace
类型相同。- 如果为
True
,则to_replace
必须是个字符串。 - 如果是个字符串,则
to_replace
必须为None
,因为它会被视作过滤器
- 如果为
-
method
:指定填充类型。可以为'pad'/'ffill'/'bfill'
。当to_replace
是个列表时该参数有效。
5.DataFrame/Series.interpolate
interpolate
是通过前后数据插值来填充NaN
。
1 2 | Series / DataFrame.interpolate(method = 'linear' , axis = 0 , limit = None , inplace = False , limit_direction = 'forward' , downcast = None , * * kwargs) |
参数:
-
method
:一个字符串,指定插值的方法。'linear'
:线性插值。只有它支持MultiIndex
'index'
/'values'
:使用索引标签的整数下标来辅助插值'nearest', 'zero', 'slinear', 'quadratic', 'cubic',
'barycentric', 'polynomial'
使用scipy.interpolate.interp1d
。对于'polynomial'/'spline'
,你需要传入一个order
(一个整数)'krogh', 'piecewise_polynomial', 'spline', 'pchip','akima'
也使用了scipy
的插值算法。它们使用索引标签的整数下标来辅助插值。'time'
: interpolation works on daily and higher resolution data to interpolate given length of interval
-
axis
:指定插值的轴。如果为0/'index'
则沿着0 轴;如果为1/'columns'
则沿着 1 轴 -
limit
:一个整数,指定插值时,如果有K
个连续的NaN
,则只插值其中的limit
个 -
limit_direction
:一个字符串。当设定了limit
时,指定处理前面limit
个NaN
,还是后面limit
个NaN
。可以为'forward'/'backward'/'both'
-
inplace
:一个布尔值。如果为True
,则原地修改。否则创建新对象。 -
downcast
:指定是否自动向下执行类型转换、 -
其他参数是传递给
scipy
的插值函数的。
四、离散化
1.pandas.cut
连续数据常常会被离散化或者拆分成面元bin
。可以通过pandas.cut()
函数来实现:
1 2 | pandas.cut(x, bins, right = True , labels = None , retbins = False , precision = 3 , include_lowest = False ) |
参数:
-
x
:一维的数据。 -
bins
:一个整数或者一个序列。- 整数:它指定了划分区间的数量。每个区间是等长的,且最左侧的区间的左侧比
x
最小值小0.1%
;最右侧的区间的右侧比x
最大值大0.1%
。 - 一个序列:它给出了
bins
的每个划分点。
- 整数:它指定了划分区间的数量。每个区间是等长的,且最左侧的区间的左侧比
-
right
:一个布尔值。如果为True
,则区间是左开右闭;否则区间是左闭右开的区间。 -
labels
:一个array
或者None
。如果为一个array
,则它指定了结果bins
的label
(要求长度与bins
数量相同)。如果为None
,则使用区间来表示。 -
retbins
:一个布尔值。如果为True
,则返回bins
-
precision
:一个整数,给出存储和显示bin label
的精度 -
include_lowest
:一个布尔值。如果为True
,则最左侧bin
的左侧是闭区间
返回的是一个Categorical
对象或者Series
对象。该函数类似于numpy.histogram()
函数。
2.pandas.qcut
1 | pandas.qcut(x, q, labels = None , retbins = False , precision = 3 ) |
参数:
-
q
:一个整数或者序列。- 整数:它指定了划分区间的数量。
- 一个序列:它给出了百分比划分点。比如
[0,0.25,0.5,0.75,0.1]
。0.25
代表25%
划分点。如果数据不在任何区间内,则标记为NaN
。
-
其他参数与
cut
相同。(qcut
没有bins
参数)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2018-12-27 去掉python的警告