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

发布于:2025-03-26 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、 数据清洗

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。
limit int,默认为无默认值。如果指定了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)