当前位置: 首页 > news >正文

Python---数据分析(Pandas八:二维数组DataFrame数据操作一: 数据清洗,数据转换)

一、 数据清洗

1.1、 isnull()

        用于检测 DataFrame 中的缺失值,它会返回一个相同形状的布尔型 DataFrame,其中每个元素表示原始 DataFrame 中相应位置的元素是否是缺失 值。

import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan],
    'B': [4, np.nan, 6],
    'C': [7, 8, 9]
})

# 打印原始DataFrame
print(df)

# 使用 isnull() 方法检测缺失值
missing_values = df.isnull()

print(missing_values)

1.2、dropna()

        用于删除 DataFrame 中的缺失值。

DataFrame.dropna(axis=0, how=any, thresh=_NoDefault.no_default, subset=None, inplace=False, ignore_index=False)
描述说明
axis{0 或 ‘index’, 1 或 ‘columns’},默认为 0。0表示按行删除,1表示按列删 除
how

{‘any’, ‘all’},默认为 ‘any’。

‘any’:如果行或列中的任意一个值是 NaN,就删除该行或列。

‘all’:如果行或列中的所有值都是 NaN,才删除该行或列。

thresh指定每行或每列至少需要有多少个非缺失值才能保留。如果设置此参 数,how 参数将被忽略。
subset指定在哪些列中搜索缺失值。如果未指定,则在所有列中搜索。
inplace是否修改 DataFrame 而不是创建新的 DataFrame。
ignore_index布尔值,默认为 False。如果为 True,则不保留原始 DataFrame 的索引
import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, np.nan, np.nan],
    'B': [4, np.nan, 6],
    'C': [7, 8, 9]
})

# 打印原始DataFrame
print(df)

# 删除任何含有 NaN 值的行
df_cleaned = df.dropna(subset=['B'])

print(df_cleaned)

1.3、fillna()

        用于填充 DataFrame 中的缺失值。

DataFrame.fillna(value=None, *, method=None, axis=0, inplace=False, limit=None)
描述说明
value填充值,可以是单个值,也可以是字典(对不同的列填充不同的值),或 者一个 Series。
method

{‘bfill’, ‘ffill’},默认为无默认值。

‘bfill’ 或 ‘backfill’:使用下一个有效观测值填充。

{0 或 ‘index’, 1 或 ‘columns’},默认为0。

axis{0 或 ‘index’, 1 或 ‘columns’},默认为0。
inplace布尔值,默认为 False。如果为 True,则在原地修改 DataFrame 而不 返回新的 DataFrame。
limitint,默认为无默认值。如果指定了method,则该参数限制连续填充的 数量。
import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan],
    'B': [np.nan, np.nan, 6],
    'C': [7, np.nan, 9]
})

# 打印原始DataFrame
print(df)

# 使用固定值填充缺失值
df_filled_value = df.fillna(value=0, limit=1, axis=1)
print(df_filled_value)

# 使用字典填充
data = {
    'A': 'a',
    'B': 'b',
    'C': 'c'
}
df_filled_dict = df.fillna(value=data)
print(df_filled_dict)

# 使用Series填充
data_series = pd.Series(['a', 'b', 'c'], ['A', 'B', 'C'])
df_filled_series = df.fillna(value=data_series)
print(df_filled_series)

# 使用前一个有效观测值填充缺失值
df_filled_ffill = df.fillna(method='ffill')
print(df_filled_ffill)

# 使用后一个有效观测值填充缺失值
df_filled_bfill = df.fillna(method='bfill', axis=1)
print(df_filled_bfill)

1.4、drop_duplicates()

        用于删除 DataFrame 中的重复行。

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
描述说明
subset指定要检查重复的列名或列名列表,默认值为 None,表示检查所有 列。
keep

{‘first’, ‘last’, False},默认为 ‘first’。

‘first’:保留第一次出现的重复项。

‘last’:保留最后一次出现的重复项。

False:删除所有重复项。

inplace是否修改 DataFrame 而不是创建新的 DataFrame。
ignore_index是否重置索引值。
import pandas as pd

# 创建一个包含重复行的 DataFrame
df = pd.DataFrame({
    'A': [1, 1, 2, 2, 3, 3],
    'B': [1, 1, 2, 3, 3, 3],
    'C': [1, 1, 2, 2, 3, 3]
})

# 打印原始DataFrame
print(df)

# 删除重复行,保留第一次出现的重复项
df_dedup_first = df.drop_duplicates(keep=False)
print(df_dedup_first)

# 根据指定列删除重复行
df_dedup_column = df.drop_duplicates(subset=['A'])
print(df_dedup_column)

# 删除重复行,保留最后一次出现的重复项
df_dedup_last = df.drop_duplicates(keep='last')
print(df_dedup_last)

# 删除所有重复行
df_dedup_all = df.drop_duplicates(keep=False)
print(df_dedup_all)

二、 数据转换

2.1、replace()

        用于替换 DataFrame 中的值。

DataFrame.replace(to_replace=None, value=_NoDefault.no_default, inplace=False, limit=None, regex=False, method=_NoDefault.no_default)
描述说明
to_replace被替换的内容,可以是 scalar, list, dict, regex。如果是字典,则键 是要替换的值,值是相应的替换值。
value替换后的值。可以是单个值、列表或数组,与 to_replace 长度相同。
inplace是否在原地修改 DataFrame。
limit限制替换的数量。可以是整数,表示最多替换多少个值。
regex是否使用正则表达式进行匹配。
method

'pad' 或 'ffill':使用前面的数据向后填充。

'backfill' 或 'bfill':使用后面的数据向前填充。

import pandas as pd

# 创建一个 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 1, 4, 5],
    'B': ['a', 'b', 'a', 'b', 'a']
})

data = {
    1: 20
}

# 用数字 100 替换所有的 1
df_replaced = df.replace(to_replace=data)

# 用字符串 'z' 替换所有的 'a'
df_replaced = df.replace(to_replace='a', value='z')

# 使用字典替换多个值
df_replaced = df.replace({
    2: 200,
    'b': 'y'
})

# 使用正则表达式替换
df_replaced = df.replace(to_replace=r'^a$', value='z', regex=True)

2.2、pivot()

        用于改变表格形状格式。

DataFrame.pivot(columns, index=typing.Literal[<no_default>], values=typing.Literal[<no_default>])
描述说明
columns作为新 DataFrame 的行索引的列名。可以是单个列名或列名列表。
index作为新 DataFrame 的列标签的列名。可以是单个列名或列名列表。
values作为新 DataFrame 的值的列名。可以是单个列名或列名列表。
import pandas as pd

# 创建一个DataFrame
df = pd.DataFrame({
    'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
    'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
    'baz': [1, 2, 3, 4, 5, 6],
    'zoo': ['x', 'y', 'z', 'q', 'w', 't']
})

# 打印原始DataFrame
print(df)

# 使用pivot方法对DataFrame进行重塑,其中foo作为行索引,bar作为列索引,baz作为值
res1 = df.pivot(index='foo', columns='bar', values='baz')

# # 打印重塑后的DataFrame
print(res1)

# 使用pivot方法对DataFrame进行重塑,其中foo作为行索引,bar作为列索引,baz、zoo作为值
res2 = df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])
# 打印重塑后的DataFrame
print(res2)

 

2.3、melt()

        用于改变表格形状格式。

DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
描述说明
id_vars保持不变的列名或列名列表。
value_vars字符串或字符串列表,可选。要重塑的列名或列名列表。这些列的 值将被展平到新的行中。
var_name新的列名,用于存储原来列的名称。默认值为 None,表示使用默认名称
value_name字符串。新的列名,用于存储原来列的值。默认值为 'value'。
col_level整数或列标签,可选。如果 DataFrame 的列是多级索引,指定要使用的级别。默认值为 None,表示使用所有级别。
ignore_index是否忽略原来的索引,重新生成一个新的默认整数索引。默认值 为 True。
import pandas as pd

# 创建一个DataFrame
df = pd.DataFrame({
    'A': {0: 'a', 1: 'b', 2: 'c'},
    'B': {0: 1, 1: 3, 2: 5},
    'C': {0: 2, 1: 4, 2: 6}
})

# 打印原始DataFrame
print(df)

# 使用melt方法对DataFrame进行重塑
res1 = df.melt(id_vars=['A'], value_vars=['B'],)

# 打印重塑后的DataFrame
print(res1)

2.4、pivot_table()

        用于生成一个指定格式的数据透视表。

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
描述说明
values要聚合的列名或列名列表。如果未指定,则使用所有数值列。
index作为新 DataFrame 的行索引的列名或列名列表。
columns作为新 DataFrame 的列标签的列名或列名列表。
aggfunc

聚合函数,可以是:

单个函数(如 'mean'、 'sum'、 'count' 等)。

函数列表(如 ['mean', 'sum'])。

字典,键是列名,值是聚合函数。

fill_value用于填充缺失值的值。默认值为 None。
margins是否添加总计行和总计列。默认值为 False。
dropna是否从结果中删除包含缺失值的行。默认值为 True。
margins_name总计行和总计列的名称。默认值为 'All'。
observed是否仅显示已观察到的类别。默认值为 False。
sort是否对结果进行排序。默认值为 True。
import numpy as np
import pandas as pd

# 创建一个DataFrame
df = pd.DataFrame({
    "A": ["foo", "foo", "foo", "foo", "foo",
          "bar", "bar", "bar", "bar"],
    "B": ["one", "one", "one", "two", "two",
          "one", "one", "two", "two"],
    "C": ["small", "large", "large", "small",
          "small", "large", "small", "small",
          "large"],
    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
    "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]
})

# 打印原始DataFrame
print(df)

# 使用pivot_table方法创建一个数据透视表
table = df.pivot_table(values=['D', 'E'], index=['A',], columns=['C'], aggfunc=np.sum, fill_value='a', margins=True, margins_name='test')

# 打印数据透视表
print(table)

 

2.5、 astype()

        用于转换 DataFrame 中指定列的数据类型。

DataFrame.astype(dtype, copy=None, errors='raise')
描述说明
dtype新的数据类型,可以是字典或数据类型。如果是字典,则键是列名,值是 要转换为的数据类型。如果指定为单一数据类型,则所有列都将转换为该类型。
copy布尔值,默认为 本。如果为 None。如果为 True,则在转换数据之前创建数据的副 False,则尽可能地避免复制,但这可能会影响到输入数据的原始 DataFrame。如果为 None(默认值),则仅在需要时复制数据。
errors{‘raise’, ‘ignore’},默认为 ‘raise’。控制当转换失败时的行为。如果为 ‘raise’,则在无法转换数据时抛出异常;如果为 ‘ignore’,则在无法转换数据时保 持原始数据类型不变。
import pandas as pd

# 创建一个示例 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4.5, 5.5, 6.5],
    'C': ['7', '8', '9']
})

# 打印原始DataFrame
print(df)

# 将列 'A' 转换为浮点数类型
df['A'] = df['A'].astype(float)

# 使用字典将多列转换为不同的数据类型
# 将列 'B' 转换为整数类型,列 'C' 也转换为整数类型
df = df.astype({
    'B': int,
    'C': int
})

# 打印转换后的DataFrame
print(df)

# 打印DataFrame中各列的数据类型
print(df.dtypes)

 

相关文章:

  • 掌握C#循环:for、while、break与continue详解及游戏案例
  • QT网络通信的接口与使用
  • 城电科技|景观光伏花 太阳能发电的景观光伏太阳花向日葵
  • 高校校园交友微信小程序的设计与实现【lw+源码+部署+讲解】
  • 接口自动化框架篇:自定义异常日志封装!
  • 【T2I】Divide Bind Your Attention for Improved Generative Semantic Nursing
  • 基于QT(C++)实现绘图程序
  • 枪机AI人工智能的识别镜头图像技术
  • 深入理解指针(1)(C语言版)
  • Android Compose 框架副作用管理(SideEffect、EffectScope)深入剖析(十八)
  • 基于Vue.js的组件化开发技术与实践探索
  • 基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)
  • Spring Security核心源码和功能实现
  • Driver具体负责什么工作
  • RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback
  • 【腾讯云架构师技术沙龙2025.03.22】
  • 前端面试常见的计算机网络内容梳理
  • RocketMQ 面试备战指南
  • Podman 学习总结
  • Can Large Language Models be Anomaly Detectors for Time Series? 解读
  • 电子凭证会计数据标准推广至全国
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人
  • 从《缶翁的世界》开始,看吴昌硕等湖州籍书画家对海派的影响
  • 李洋谈美国黑帮电影与黑帮文化
  • 打造信息消费新场景、新体验,上海信息消费节开幕
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途